ネイティブ クラッシュをデバッグする
ネイティブ クラッシュのダンプや tombstone の基礎知識については、ネイティブ Android プラットフォーム コードをデバッグするをご覧ください。
一般的なクラッシュ タイプの一覧とその調査方法については、ネイティブ クラッシュを診断するをご覧ください。
ndk-stack ツールは、クラッシュのシンボル化に役立ちます。一般的なアプリのデバッグのドキュメントの説明にあるように、Android Studio でクラッシュをデバッグできます。コマンドラインを使用する場合は、ndk-gdb を使用すると、シェルから gdb
または lldb
をアタッチできます。
アプリが Tombstone トレースに直接アクセスできるようにする
Android 12(API レベル 31)以降では、ApplicationExitInfo.getTraceInputStream()
メソッドからアプリのネイティブ クラッシュ Tombstone にプロトコル バッファとしてアクセスできます。プロトコル バッファは、こちらのスキーマを使用してシリアル化されます。これまでは、Android Debug Bridge(adb)でしかこの情報にアクセスできませんでした。
アプリに実装する例を次に示します。
ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);
for (ApplicationExitInfo aei: exitReasons) {
if (aei.getReason() == REASON_CRASH_NATIVE) {
// Get the tombstone input stream.
InputStream trace = aei.getTraceInputStream();
// The tombstone parser built with protoc uses the tombstone schema, then parses the trace.
Tombstone tombstone = Tombstone.parseFrom(trace);
}
}
ネイティブ メモリの問題をデバッグする
AddressSanitizer(HWASan / ASan)
HWAddressSanitizer(HWASan)と Address Sanitizer(ASan)は Valgrind に似たツールですが、Android での高速化とサポートが大幅に向上しています。
これらのツールは、Android でメモリエラーをデバッグするのに最適です。
malloc デバッグ
ネイティブ メモリ問題をデバッグするための C ライブラリの組み込みオプションの詳細については、malloc デバッグと libc コールバックを使用したネイティブ メモリ トラッキングをご覧ください。
malloc フック
独自のツールをビルドする場合、Android の libc は、プログラムの実行中に発生するすべての割り当て / フリーコールのインターセプトもサポートしています。使用方法については、malloc_hooks のドキュメントをご覧ください。
malloc 統計情報
Android は、<malloc.h>
の拡張である mallinfo(3) と malloc_info(3) をサポートしています。
malloc_info
機能は、Android 6.0(Marshmallow)以降で使用できます。その XML スキーマは、Bionic の malloc.h ヘッダーに記載されています。
プロファイリング
ネイティブ コードの CPU プロファイリングには、Simpleperf を使用できます。