0

JavaVM() を作成する C/C++ アプリケーションから Java Swing パネルを呼び出します。すべて正常に動作します。何らかの理由で C/C++ がクラッシュすると、致命的なエラーが Java ランタイム環境によって検出されましたというメッセージが表示されます。クラッシュは、ネイティブ コードの JVM の外部で発生しました。

ネイティブ コードのエラーを無視するために JVM で設定できるオプションはありますか? 以下、メッセージです。

Java ランタイム環境によって致命的なエラーが検出されました:

pc=0xfd933144、pid=29358、tid=1 の SIGSEGV (0xb)

JRE バージョン: 6.0_22-b04 Java VM: Java HotSpot(TM) Client VM (17.1-b03 混合モード solaris-sparc ) 問題のあるフレーム: C [libc.so.1+0x33144] strlen+0x80

バグ レポートを提出したい場合は、http: //java.sun.com/webapps/bugreport/crash.jspにアクセスしてください 。ネイティブ コードの Java 仮想マシンの外部でクラッシュが発生しました。バグを報告する場所については、問題のあるフレームを参照してください。

4

2 に答える 2

1

いいえ、絶対にいいえ。

致命的なエラーが発生した場合、それは JRE が、JRE データ構造の重大な破損が発生したと考えられる状況を検出したためです。たとえば、ヒープが破損しています。

破損している可能性のある状態で JRE を継続させる方法はありません。とにかくしようとするのは悪い考えです。


これらのクラッシュの原因となっている C / C++ コードの問題を見つけて修正する必要があります。それが難しすぎる場合は、次のようにします。

  • Java でネイティブ コードを再コーディングし、C / C++ バージョンを捨てる、または
  • C / C++ コードを独立したアプリケーションに変換し、System.exec()... などを使用して実行します。

(または、C / C++ アプリケーション内で JVM を実行しているため、代わりに後者を取得して別の JVM を起動します。)

于 2013-02-19T23:03:52.197 に答える
0

@Stephen Cが指摘したように、クラッシュを無視して他の方法を見るのではなく、クラッシュを修正するようにしてください。

ただし、クラッシュが範囲外の場合 (バグのあるライブラリなど) は、Java から開始するようにアプリケーションを書き直すことができます。Java プログラムは、JNI を介して C++ アプリを呼び出し、ネイティブ コードで C++ 呼び出しを try/catch ブロックにラップする以外に何もしません。例外 (メモリ アクセス違反など) が予想される場合は、それをキャッチして何もしません。

コード例は、この SO 回答で確認できます: https://stackoverflow.com/a/918891/1043352

于 2013-02-21T07:32:48.513 に答える