このセクションには、クラッシュしたばかりのスレッドに関する情報が含まれます。複数のスレッドが同時にクラッシュした場合、1つのスレッドのみが出力されます。
スレッド・セクションの最初の部分は、例A-6に示すように、致命的エラーを引き起こしたスレッドを示しています。
例A-6 エラー・ログのスレッド・セクション
Current thread (0x0805ac88): JavaThread "main" [_thread_in_native, id=21139] | | | | +-- ID | | | +------------- state | | +-------------------------- name | +------------------------------------ type +-------------------------------------------------- pointer
スレッド・ポインタは、Java VM内部のスレッド構造体へのポインタです。ライブJava VMやコア・ファイルのデバッグを行なっているのでないかぎり、これは一般に役に立ちません。
次の一覧は、可能性のあるスレッド・タイプを示したものです。
JavaThread
VMThread
CompilerThread
GCTaskThread
WatcherThread
ConcurrentMarkSweepThread
表A-2は、重要なスレッド状態を示しています。
表A-2 スレッドの状態
スレッドの状態 | 説明 |
---|---|
|
スレッドが作成されていません。これが発生するのは、メモリーが破損した場合だけです。 |
|
スレッドは作成済みですがまだ開始されていません。 |
|
スレッドはネイティブ・コードを実行しています。エラーはおそらくネイティブ・コードのバグです。 |
|
スレッドはVMコードを実行しています。 |
|
スレッドは、解釈済みまたはコンパイル済みのJavaコードを実行しています。 |
|
スレッドがブロックされています。 |
|
上のいずれかの状態のあとに |
出力に含まれるスレッドIDは、ネイティブ・スレッド識別子です。
Javaスレッドがデーモン・スレッドの場合、スレッドの状態の前にdaemonという文字列が出力されます。
エラー・ログ内のその次の情報は、VMが終了する原因となった予期しないシグナルの説明です。Windowsシステムでは、出力は例A-7のように表示されます。
前述の例では、例外コードは0xc0000005
(ACCESS_VIOLATION
)であり、スレッドがアドレス0xd8ffecf1
を読み取ろうとしたときに例外が発生しました。
Oracle SolarisおよびLinuxオペレーティング・システムでは次のように、例外を識別するためにシグナル番号(si_signo
)とシグナル・コード(si_code
)が使用されます。
siginfo:si_signo=11, si_errno=0, si_code=1, si_addr=0x00004321
エラー・ログ内のその次の情報は、致命的エラー発生時のレジスタ・コンテキストを示します。この出力の実際の形式はプロセッサに依存します。例A-8は、Intel (IA32)プロセッサの出力を示しています。
例A-8 致命的エラーのレジスタ・コンテキスト
Registers: EAX=0x00004321, EBX=0x41779dc0, ECX=0x080b8d28, EDX=0x00000000 ESP=0xbfffc1e0, EBP=0xbfffc1f8, ESI=0x4a6b9278, EDI=0x0805ac88 EIP=0x417789d7, CR2=0x00004321, EFLAGS=0x00010216
レジスタの値は、次に説明する命令と組み合わせると、役立つ可能性があります。
レジスタ値の後、例A-9に示すように、エラー・ログには、システムがクラッシュしたときのスタックの最上段と、プログラム・カウンタ(PC)付近の32バイトの命令(操作コード)が含まれています。これらの操作コードを逆アセンブラでデコードすれば、クラッシュの場所の近くにあった命令を生成できます。注意: IA32およびAMD64命令は可変長であるため、常にクラッシュPCの前の命令を間違いなくデコードできるとはかぎりません。
例A-9 エラー・ログ内のスタックの最上段
Top of Stack: (sp=0xbfffc1e0) 0xbfffc1e0: 00000000 00000000 0818d068 00000000 0xbfffc1f0: 00000044 4a6b9278 bfffd208 41778a10 0xbfffc200: 00004321 00000000 00000cd8 0818d328 0xbfffc210: 00000000 00000000 00000004 00000003 0xbfffc220: 00000000 4000c78c 00000004 00000000 0xbfffc230: 00000000 00000000 00180003 00000000 0xbfffc240: 42010322 417786ec 00000000 00000000 0xbfffc250: 4177864c 40045250 400131e8 00000000 Instructions: (pc=0x417789d7) 0x417789c7: ec 14 e8 72 ff ff ff 81 c3 f2 13 00 00 8b 45 08 0x417789d7: 0f b6 00 88 45 fb 8d 83 6f ee ff ff 89 04 24 e8
例A-10に示すように、可能な場合、エラー・ログ内のその次の出力はスレッド・スタックです。これには、スタックのベースと先頭のアドレス、現在のスタック・ポインタ、およびスレッドで使用可能な未使用スタックの量が含まれます。このあとに可能であればスタック・フレームが続き、最大100件のフレームが出力されます。C/C++フレームの場合、ライブラリ名も出力される可能性があります。注意: 致命的エラーの状態によっては、スタックが破損している可能性があり、その場合にこの詳細が利用できない場合があります。
例A-10 エラー・ログのスレッド・スタック
Stack: [0x00040000,0x00080000), sp=0x0007f9f8, free space=254k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [jvm.dll+0x83d77] C [App.dll+0x1047] j Test.foo()V+0 j Test.main([Ljava/lang/String;)V+0 v ~StubRoutines::call_stub V [jvm.dll+0x80f13] V [jvm.dll+0xd3842] V [jvm.dll+0x80de4] C [java.exe+0x14c0] C [java.exe+0x64cd] C [kernel32.dll+0x214c7] Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j Test.foo()V+0 j Test.main([Ljava/lang/String;)V+0 v ~StubRoutines::call_stub
ログには2つのスレッド・スタックが含まれます。
1つ目のスレッド・スタックはNative frames
であり、すべての関数呼出しを示すネイティブ・スレッドを出力します。ただし、このスレッド・スタックはランタイム・コンパイラでインライン化されるJavaメソッドを考慮に入れません。そのため、インライン化されたメソッドは、親のスタック・フレームの一部として表示されます。
ネイティブ・フレームのスレッド・スタックの情報は、クラッシュの原因に関する重要な情報を提供します。リスト内のライブラリを上から順に分析すれば、通常は、問題の原因となったライブラリを特定し、そのライブラリを担当する適切な組織に問題を報告することができます。
2番目のスレッド・スタックであるJavaフレーム
では、Javaフレーム(インライン化されたメソッドを含む)が出力され、ネイティブ・フレームはスキップされます。クラッシュによっては、ネイティブ・スレッド・スタックを出力できなくても、Javaフレームを出力できる可能性があります。
エラーがVMスレッドまたはコンパイラ・スレッドで発生した場合は、例A-11の追加の詳細が表示されることがあります。たとえばVMスレッドの場合、致命的エラーの発生時にVMスレッドがVM操作を実行していた場合、そのVM操作が出力されます。次の出力例の場合、致命的エラーを引き起こしたのはコンパイラ・スレッドです。タスクはコンパイラ・タスクであり、HotSpot Client VMがメソッドhs101t004Thread.ackermann
をコンパイルしています。
例A-11 エラー・ログのVMスレッドまたはコンパイル・スレッド
Current CompileTask: HotSpot Client Compiler:754 b nsk.jvmti.scenarios.hotswap.HS101.hs101t004Thread.ackermann(IJ)J (42 bytes)
HotSpot Server VMの場合はコンパイラ・タスクの出力が若干異なりますが、やはり完全なクラス名とメソッドを含んでいます。