Java

エラー報告

 

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

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

エラー報告機構を使ってもクラッシュの発生源を特定できないことがあります。エラーハンドラを最大限に活用するために、開発者は次のようなガイドラインと制限に留意する必要があります。

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

環境によっては、エラー報告機構がシンボル名を識別できないことがあります。多くの場合、クラッシュしたバイナリコードがデバッグモードでコンパイルされていないために、シンボルテーブルがないことが原因です。開発者はデバッグモードでコンパイルして、必要なデバッグ情報を含めるようにする必要があります。たとえば Visual Studio では、プロジェクトのビルドモードとして「Release」ではなく「Debug」を選択します。Linux や SolarisTM が動作する環境で gcc や cc を使う場合は、-g コマンド行オプションを指定してコンパイルしてください。

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

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

Visual Studio での制限 (Windows 95/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© 2002 Sun Microsystems, Inc.All Rights Reserved.

Sun