4

here で説明されているように、JNI を介して Java VM を作成する C++ プログラム (Win32、MS Visual Studio 2008) を開発しています。Java 6 と Java 7 の両方で、長い間正常に動作しています。

今日、新しいバージョンの JRE をインストールしました。インストーラーで何か問題が発生し、JRE が破損しました。C++ プログラムが起動せず、警告メッセージも表示されないことに気付きました。プログラムをデバッグすると、JNI_CreateJavaVM呼び出しまで正常に実行されることが示されました。ただし、呼び出すJNI_CreateJavaVMと、プログラムは即座に終了します。戻り値も、​​エラー メッセージも、何もありません。

はい、JRE を再インストールするだけでよいことはわかっています。それでも、私の C++ プログラムはそのような状況に備えてほしいと思います。Java VM を作成できない場合は、「JRE を再インストールしてください」というメッセージが表示されます。しかし、プログラム全体が終了しているため、そのメッセージを表示する機会がありません。

JRE、またはより一般的にはサードパーティのライブラリでそのようなタイプのエラーを検出する方法はありますか? C++try/catchコンストラクトを使用してみました。シグナル関数を使用してみましたが、何も役に立ちません。プログラムは、catch ハンドラまたはシグナル ハンドラを呼び出さずに消えます。

そのような JRE クラッシュを検出する方法はありますか? または: サードパーティ ライブラリ内のクラッシュまたは終了を確実に検出する方法はありますか?

4

1 に答える 1

1

Linux/Unix を使用している場合: これは私が通常開始するものです:

struct sigaction sa;
sa.sa_handler = bt_sighandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;

sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);

Windows で Microsoft C++ を使用している場合: 通常、_ try/ _except でうまくいきます。これは、標準の try/catch を拡張する MSVC 拡張 (2 つのアンダースコアからわかります) です。

Try/catch は C++ の例外をキャッチし、_ try/ _except は他のすべての未処理の例外 (COM、Win32 など) をキャッチします。たとえば、クラッシュの原因となる可能性のある null 参照解除、メモリ アクセスの問題をキャッチします。ここを読む

それ以外の場合は、未亡人でSetUnhandledExceptionFilterを試してください。

編集: SEH を使用したアプローチは失敗しているように見えるため、1 レベル上に移動して、ベクトル化された例外処理を使用することができます。msdn のこのブログ投稿によると、VEH はプロセスごとに登録され、SEH の前にチェックされます。

すべてが失敗した場合でも、絶望しないでください :) アプリケーションをペアのデバッガー/デバッグ対象にすることができます。これにより、デバッグ対象プロセスのイベント、生死を完全に制御できます。これは一般的に問題に値するものではありませんが、これは私が過去に使用しなければならなかった追加のソリューションです。また、見た目ほど難しくありません。他に何か失敗した場合はお知らせください。古いコードを掘り下げます。

于 2013-02-19T13:41:43.353 に答える