エラー報告

Java 仮想マシン (JVM) がネイティブコード (開発者が書いた JNI コードなど) でクラッシュを検出した場合や、JVM 自体がクラッシュした場合、JVM はクラッシュに関するデバッグ情報を出力します。通常、このエラーメッセージには、関数名、ライブラリ名、ソースファイル名、エラーが発生した行番号などの情報が含まれます。(現段階では、ファイル名と行番号の情報は Microsoft Windows プラットフォームの場合にのみ出力されます。)エラーハンドラが発行するメッセージの例は JNI エラーの例を参照してください。

新しいエラー報告メカニズムが提供する情報により、開発者はアプリケーションのデバッグを従来よりも簡単にしかも効率的に行うことができます。エラーメッセージから JVM コード自体の問題がわかれば、開発者はより正確な役に立つバグレポートを提出できます。

エラー報告メカニズムを使ってもクラッシュ発生源の特定に役立つ可能性がある情報を判断できないことがあります。エラーハンドラを最大限に活用するために、開発者は次のようなガイドラインと制限に留意するようにしてください。

デバッグモードでのコンパイル

環境によっては、エラー報告メカニズムがシンボル名を識別できないことがあります。これのもっとも一般的な理由は、クラッシュしたバイナリコードがデバッグモードでコンパイルされていないために、シンボルテーブルがないことです。開発者はデバッグモードでコードをコンパイルして、必要なデバッグ情報を含めるようにすることをお勧めします。たとえば Visual Studio では、プロジェクトのビルドモードとして「Release」ではなく「Debug」を選択することを意味します。Linux や Solaris オペレーティング環境で gcc や cc を使う場合は、-g コマンド行オプションを指定してコンパイルしてください。

エクスポートされていない関数

バイナリコードにデバッグ情報がない場合でも、エラーハンドラはクラッシュサイトの関数名を出力できます。ただし、問題の関数がダイナミックライブラリから「エクスポート」されていない場合、その関数名が必ずしも正しいとは限りません。Linux や Solaris では、static と宣言された関数以外のすべての関数がエクスポートされます。Microsoft Windows プラットフォームでは、JNIEXPORT__declspec(dllexport) で明示的に宣言されないかぎり、関数はエクスポートされません

Visual Studio の制限 (Windows 98 および Windows NT)

Windows 98 および Windows NT プラットフォームでは、エラーハンドラはシステムの imagehlp.dll ファイルを使って関数名、ソースファイル、クラッシュサイトの行番号を識別します。(Windows 2000 と Windows ME では、imagehlp.dlldebughlp.dll の 2 つのファイルを使ってこのタスクを実行します。)ただし、Windows 98 および Windows NT の imagehlp.dll ファイルは、Visual Studio 6.0 で生成されたバイナリコードや DLL ではうまく動作しません。

この問題によって、エラーハンドラが関数名、ソースファイル、クラッシュサイトの行番号に関する間違った情報でエラーメッセージを生成する可能性がありますが、エラーメッセージ内のその他の情報は正しいです。


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