9

インターフェイスとして提供される JNI クラスを介して、サードパーティのネイティブ モジュールにアクセスする Java 1.6 アプリケーションがあります。最近、ネイティブ モジュールで SEGFAULT が発生し、アプリケーションがクラッシュしていることに気付きました。少なくとも死ぬ前に適切にログに記録するために、このイベントをキャッチして処理することは可能ですか?


kjp's answerの記事で両方の Java 手法を試しました。どちらも機能しませんでした。「SEGV」にシグナル ハンドラをインストールしようとすると、例外が発生する

VM で既に使用されている信号: SEGV

私がインストールしたシャットダウン ハンドラーは、おそらくIBM の記事に次のように記載されているため、起動に失敗しました。

次の場合、シャットダウン フックは実行されません。

JVM を終了するために、Runtime.halt() メソッドが呼び出されます。Runtime.halt() は、JVM の迅速なシャットダウンを可能にするために提供されています。
-Xrs JVM オプションが指定されています。
JVM ソフトウェアによって生成された例外条件または強制アボートなど、JVM が異常終了します。

4

2 に答える 2

2

ログを記録して通知するだけなら、アプリケーションを実行するスクリプトを作成できます。アプリケーションが停止すると、スクリプトはアプリケーションが正常に終了したかどうかを検出し、すべてのクラッシュ/SEGV 情報を含む hs_errXXXX ファイルからそれを誰かにメールで送信します (必要に応じてアプリケーションを再起動します)。


問題のある JNI コードを別の JVM で実行し、RMI、JMS、またはソケットを使用してその JVM と通信する必要があります。この方法では、ライブラリが停止しても、メイン アプリケーションがダウンすることはなく、再起動できます。

于 2012-07-04T19:48:02.847 に答える
1

当時の数週間の調査と、カンファレンスでの JVM エンジニアとの会話に基づくと、これは不可能です。システムでは、SEGV シグナルに SignalHandler をインストールすることはできません。

于 2016-11-08T16:03:51.983 に答える