Java でクラッシュ ログをキャプチャする方法
-
09-06-2019 - |
質問
私は現在、Windows、Linux、MacOS X でうまく動作する Java のクロスプラットフォーム アプリケーションに取り組んでいます。私は「クラッシュ」の検出(および処理)を行うための良い方法を考え出そうとしています。Java での「クラッシュ」を検出し、それに応じて何かを行う簡単なクロスプラットフォームの方法はありますか?
「クラッシュ」とは、キャッチされなかった例外を意味すると思います。ただし、コードでは一部の JNI が使用されているため、不正な JNI コードによるクラッシュを検出できれば良いのですが、これは JVM 特有のような気がします。
解決
単純なキャッチオール処理のために、次の静的メソッドを使用できます。 糸. 。Javadoc から:
静的ボイド setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler えっ)
例外がキャッチされずにスレッドが突然終了し、そのスレッドに他のハンドラーが定義されていない場合に呼び出されるデフォルトのハンドラーを設定します。
これは、他では捕捉できない可能性のあるエラーや未チェックの例外を処理するための非常に広範な方法です。
サイドノート: コードが問題の原因に近いところで例外をキャッチ、記録、および/または回復できれば、より良いことになります。私は、この種の一般化されたクラッシュ処理は、完全に回復不可能な状況(つまり、のサブクラス java.lang.エラー)。の可能性を避けるようにしてください。 ランタイム例外 ソフトウェアがそれを生き延びることは可能であり、それが望ましいかもしれないため、完全に捕らえられることはありません。
他のヒント
キャッチされなかった例外を処理するために、ThreadGroup.uncaughtException(...) の実装を提供する新しい ThreadGroup を提供できます。その後、キャッチされなかった例外をキャッチし、それらを適切に処理できます (例:クラッシュログをホームに送信します)。
JNI の面では私はあなたを助けることができません。JVM を呼び出す前にネイティブ ラッパー実行可能ファイルを使用する方法はおそらくありますが、その実行可能ファイルは、呼び出す可能性のあるすべての JVM と、指示がどのようにクラッシュし、どこでクラッシュするかを知る必要があります。クラッシュログなどが置かれます。
これが必要かどうかはわかりませんが、ネイティブ コード内から例外が発生したかどうかを検出することもできます。見る http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234 詳細については。