プロジェクトをデバッグする

ネイティブ クラッシュをデバッグする

ネイティブ クラッシュのダンプや 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 を使用できます。