3.4. 致命的なエラーログファイルでのデバッグシンボルの設定
JVM クラッシュが原因で Java アプリケーションがダウンすると、致命的なエラーのログファイルが生成されます (例: hs_error
、java_error
)。これらのエラーログファイルは、アプリケーションの現在の作業ディレクトリーに生成されます。クラッシュファイルには、スタックに関する情報が含まれます。
手順
strip -g
コマンドを使用すると、デバッグシンボルをすべて削除できます。以下のコードは、展開されていない
hs_error
ファイルの例を示しています。Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xb83d2a] Unsafe_SetLong+0xda j sun.misc.Unsafe.putLong(Ljava/lang/Object;JJ)V+0 j Crash.main([Ljava/lang/String;)V+8 v ~StubRoutines::call_stub V [libjvm.so+0x6c0e65] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0xc85 V [libjvm.so+0x73cc0d] jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*) [clone .constprop.1]+0x31d V [libjvm.so+0x73fd16] jni_CallStaticVoidMethod+0x186 C [libjli.so+0x48a2] JavaMain+0x472 C [libpthread.so.0+0x9432] start_thread+0xe2
以下のコードは、ストライピング
hs_error
ファイルの例を示しています。Stack: [0x00007ff7e1a44000,0x00007ff7e1b44000], sp=0x00007ff7e1b42850, free space=1018k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xa7ecab] j sun.misc.Unsafe.putAddress(JJ)V+0 j Crash.crash()V+5 j Crash.main([Ljava/lang/String;)V+0 v ~StubRoutines::call_stub V [libjvm.so+0x67133a] V [libjvm.so+0x682bca] V [libjvm.so+0x6968b6] C [libjli.so+0x3989] C [libpthread.so.0+0x7dd5] start_thread+0xc5
以下のコマンドを入力して、同じバージョンのデバッグシンボルと致命的なエラーログファイルがあることを確認します。
$ java -version
注記このチェックを完了するには、
sudo update-alternatives --config 'java'
を使用することもできます。nm
コマンドを使用して、libjvm.so
に ELF データおよびテキストシンボルがあることを確認します。$ nm /usr/lib/debug/usr/lib/jvm/java-17-openjdk-17.0.2.0.8-4.el8_5/lib/server/libjvm.so-17.0.2.0.8-4.el8_5.x86_64.debug
関連情報
-
クラッシュファイル
hs_error
は、デバッグシンボルがインストールされない状態で不完全です。詳細は、「Java application down due to JVM crash」を参照してください。