SIG_SEGV を使用して NDK コードでクラッシュするアプリを開発しています。これにより、アプリが約 15 秒間ハングし、Android から強制的に閉じるように求められます。これにより、Java スタック トレースが logcat に出力されますが、NDK のスタック トレースは表示されません。ADB で stdio をリダイレクトしましたが、まだスタック トレースが表示されません。C++ スタック トレースを logcat に出力するにはどうすればよいですか?
Android 2.3.4
NDK r8b の使用
3 に答える
「強制終了」ダイアログは、クラッシュしているアプリケーションによって投稿されます。これは、ネイティブ クラッシュではなく、Dalvik クラッシュのように聞こえます。プロセスが SIGSEGV を受信している場合、debuggerd に通知して終了し、ログにトレースを残す必要があります。クラッシュからの logcat 出力を質問に含めると役立つ場合があります。
いずれにせよ、最近のバージョンの Android には、スレッドがネイティブ コードにある場合に Dalvik スタック ダンプと混合されたネイティブ トレースが含まれています。Android の最近のバージョンを実行しているルート化されたデバイスを使用している場合は、debuggerd にすべてのスレッドのトレースをダンプするように依頼できますadb shell debuggerd -b <pid>
。
ただし、Android 2.3.x を使用しているため、どれも役に立ちません。最良のオプションは、プロセスに致命的なシグナルを送信して debuggerd のクラッシュ ダンプを取得することです。シグナルは 2 回送信する必要があります。
adb shell kill -6 <pid> ; sleep 1 ; adb shell kill -6 <pid>
「シェル」ユーザーは任意のプロセスにシグナルを送信できないため、ルート化されたデバイスが必要です。正確に何が起こっているかに応じて、「強制終了」ダイアログがまだ画面に表示されている間にこれを実行できるはずですが、プロセスを停止せずにスレッドがクラッシュした場合、取得するスタックがない可能性がありますからの痕跡。