Java Platform, Standard Editionトラブルシューティング・ガイド
目次      

スレッド・セクションの形式

このセクションには、クラッシュしたばかりのスレッドに関する情報が含まれます。 複数のスレッドが同時にクラッシュした場合、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 スレッドの状態

スレッドの状態 説明

_thread_uninitialized

スレッドが作成されていません。 これが発生するのは、メモリーが破損した場合だけです。

_thread_new

スレッドは作成済みですがまだ開始されていません。

_thread_in_native

スレッドはネイティブ・コードを実行しています。 エラーはおそらくネイティブ・コードのバグです。

_thread_in_vm

スレッドはVMコードを実行しています。

_thread_in_Java

スレッドは、解釈済みまたはコンパイル済みのJavaコードを実行しています。

_thread_blocked

スレッドがブロックされています。

..._trans

上のいずれかの状態のあとに_transという文字列がある場合、スレッドが別の状態へ遷移中であることを意味します。


出力に含まれるスレッドIDは、ネイティブ・スレッド識別子です。

Javaスレッドがデーモン・スレッドの場合、スレッドの状態の前にdaemonという文字列が出力されます。

シグナル情報

エラー・ログ内のその次の情報は、VMが終了する原因となった予期しないシグナルの説明です。 Windowsシステムでは、出力は例A-7のように表示されます。

例A-7 エラー・ログの予期しないシグナルのセクション

siginfo: ExceptionCode=0xc0000005, reading address 0xd8ffecf1

前述の例では、例外コードは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の場合はコンパイラ・タスクの出力が若干異なりますが、やはり完全なクラス名とメソッドを含んでいます。

目次      

Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved.