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

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

このセクションには、クラッシュしたばかりのスレッドに関する情報が含まれます。複数のスレッドが同時にクラッシュした場合、1つのスレッドのみが出力されます。

スレッド情報

スレッド・セクションの最初の部分は、例A-6に示すように、致命的エラーを引き起こしたスレッドを示しています。

スレッド・ポインタは、Java VM内部のスレッド構造体へのポインタです。ライブJava VMやコア・ファイルのデバッグを行なっているのでないかぎり、これは一般に役に立ちません。

次の一覧は、可能性のあるスレッド・タイプを示したものです。

  • JavaThread

  • VMThread

  • CompilerThread

  • GCTaskThread

  • WatcherThread

  • ConcurrentMarkSweepThread

表A-2は、重要なスレッド状態を示しています。

出力に含まれるスレッド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-9に示すように、エラー・ログには、システムがクラッシュしたときのスタックの最上段と、プログラム・カウンタ(PC)付近の32バイトの命令(操作コード)が含まれています。これらの操作コードを逆アセンブラでデコードすれば、クラッシュの場所の近くにあった命令を生成できます。注意: IA32およびAMD64命令は可変長であるため、常にクラッシュPCの前の命令を間違いなくデコードできるとはかぎりません。

スレッド・スタック

例A-10に示すように、可能な場合、エラー・ログ内のその次の出力はスレッド・スタックです。これには、スタックのベースと先頭のアドレス、現在のスタック・ポインタ、およびスレッドで使用可能な未使用スタックの量が含まれます。このあとに可能であればスタック・フレームが続き、最大100件のフレームが出力されます。C/C++フレームの場合、ライブラリ名も出力される可能性があります。注意: 致命的エラーの状態によっては、スタックが破損している可能性があり、その場合にこの詳細が利用できない場合があります。

ログには2つのスレッド・スタックが含まれます。

  • 1つ目のスレッド・スタックはNative framesであり、すべての関数呼出しを示すネイティブ・スレッドを出力します。ただし、このスレッド・スタックはランタイム・コンパイラでインライン化されるJavaメソッドを考慮に入れません。そのため、インライン化されたメソッドは、親のスタック・フレームの一部として表示されます。

    ネイティブ・フレームのスレッド・スタックの情報は、クラッシュの原因に関する重要な情報を提供します。リスト内のライブラリを上から順に分析すれば、通常は、問題の原因となったライブラリを特定し、そのライブラリを担当する適切な組織に問題を報告することができます。

  • 2番目のスレッド・スタックであるJavaフレームでは、Javaフレーム(インライン化されたメソッドを含む)が出力され、ネイティブ・フレームはスキップされます。クラッシュによっては、ネイティブ・スレッド・スタックを出力できなくても、Javaフレームを出力できる可能性があります。

追加詳細

エラーがVMスレッドまたはコンパイラ・スレッドで発生した場合は、例A-11の追加の詳細が表示されることがあります。たとえばVMスレッドの場合、致命的エラーの発生時にVMスレッドがVM操作を実行していた場合、そのVM操作が出力されます。次の出力例の場合、致命的エラーを引き起こしたのはコンパイラ・スレッドです。タスクはコンパイラ・タスクであり、HotSpot Client VMがメソッドhs101t004Thread.ackermannをコンパイルしています。

HotSpot Server VMの場合はコンパイラ・タスクの出力が若干異なりますが、やはり完全なクラス名とメソッドを含んでいます。

目次      

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