エラー報告

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, 2020, Oracle and/or its affiliates. All rights reserved.