Sun Java Solaris Communities My SDN Account Join SDN
 
Article

 

J2SE 1.3.1 でのエラー処理

 英語版

J2SE 1.3.1 に付属する Java Virtual Machine (JVM) には、新しいエラー処理機能があります。JVM は、開発者が書いた JNI コ‐ドなどのネイティブコードでクラッシュを検知したり、JVM 自体がクラッシュしたりすると、クラッシュに関するデバッグ情報を出力します。このエラーメッセージには、通常、エラーが発生した関数名、ライブラリ名、ソースファイル名、および行番号などの情報が含まれます。(現在のところ、ファイル名と行番号の情報は Microsoft Windows プラットフォームでのみ利用可能です。) エラーハンドラが生成するメッセージの例として、JNI エラーの例を参照してください。

この新しいエラー処理機構が提供する情報により、開発者はさらに容易に効率良くアプリケーションのデバッグを行うことができるようになります。JVM コード自体に問題があることがエラーメッセージによって明らかになれば、開発者に対しより正確で有用なバグレポートを作成させることができます。

クラッシュの原因となった箇所の特定に有用な情報を、エラー処理機構が検知できない場合もあります。エラーハンドラを使いこなすために、以下のガイドラインと制限事項に注目してください。

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

特定の状況下では、エラー処理機構はシンボル名を特定できません。多くの場合その原因は、クラッシュしたバイナリコードがデバッグモードでコンパイルされなかったため、シンボルテーブルが無いことです。必要なデバッグ情報が確実に含まれるようにするには、コードをデバッグモードでコンパイルする必要があります。たとえば Visual Studio でデバッグモードにするには、プロジェクトビルドモードとして [Release] ではなく [Debug] を選択します。Linux または Solaris オペレーティング環境で gcc や cc を使用するときは、コマンド行オプション -g を指定してコンパイルしてください。

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

エラーハンドラは、バイナリコードにデバッグ情報が含まれていなくても、クラッシュ箇所の関数名を出力することがあります。しかし、問題のある関数がダイナミックライブラリからエクスポートされていない場合、その関数名は正しくない可能性があります。Linux および Solaris オペレーティング環境では、static として宣言されていない限りすべての関数はエクスポートされます。Microsoft Windows プラットフォームでは、明示的に宣言 (JNIEXPORT または __declspec(dllexport) を使用) しない限り関数はまったくエクスポートされません。

Microsoft Windows 95/98 および Windows NT での Visual Studio の制限

Microsoft Windows 95、Windows 98、および Windows NT プラットフォームでは、クラッシュ箇所の関数名、ソースファイル、および行番号の判定に、エラーハンドラはシステムの imagehlp.dll ファイルを使います。(Microsoft Windows 2000 および Windows ME は同様の処理に imagehlp.dlldebughlp.dll の 2 つのファイルを使います。) しかし、Microsoft Windows 95/98 および Windows NT の imagehlp.dll ファイルは、Visual Studio 6.0 で生成されたバイナリコードと DLL の場合に正しく動作しません。この問題は、Visual Studio 6.0 に導入されたファイル形式の変更によるものです。この問題の詳細と Microsoft 社が推奨する回避策は、Microsoft Product Support Services の Web サイトに記載されています。

エラーハンドラはこの問題のため、クラッシュ箇所の関数名、ソースファイル、および行番号に関して不正な情報を含むエラーメッセージを生成します。ただし、エラーメッセージ内のそれ以外の情報は正確です。