問題の背景
Java が jni を介して C++ SDK を統合すると、時折クラッシュがオンラインで見つかります。ネイティブ (C++) クラッシュの場所を特定しやすくするために、SDK は Google Breakpad クラッシュ ダンプ ソリューション (Google のクロスプラットフォーム クラッシュ ダンプおよび分析フレームワークと、ツール、ブレークパッドは、Windows、Linux、MacOS、Android、iOS などをサポートしています。現在、Google Chrome、Firefox、Google Picasa、Camino、Google Earth およびその他のプロジェクトで使用されています。)、SDK を更新した後、Java が起動後にクラッシュ。
根本原因分析
最終的な理由は次のように特定されました。
- jvm は信号処理関数を登録しました。たとえば、StackoverflowError と NPE (NullPointerException) が SIGSEGV を受信すると、仮想マシンはこれら 2 つの例外に対して終了することを選択せず、内部で追加の処理を実行し、実際にアプリケーション層に例外をスローするだけで (これら 2 つのエラーは jvm ではよくあることなので)、jvm はクラッシュしません。
- SDK ブレークパッドはシグナルをキャッチし、ミニダンプを書き込んだ直後にプロセスを終了しました。
解決
SDK がプロセスを直接終了せずにシグナルをキャプチャしてミニダンプを書き込む限り、例外をスローし続け、jvm がそれらをキャプチャして処理できるようにします。このソリューションの欠点の 1 つは、実行中に大量のミニダンプ ファイルが生成される可能性があることです。問題のトラブルシューティングを行う場合は、最後のミニダンプを使用してください。
実際の操作: MinidumpCallback コールバックは成功せずに false を返します。
参考: スレッドのクラッシュによって JVM がクラッシュしない理由 (https://www.cnblogs.com/xiekun/p/16378063.html)