為專案偵錯

針對原生程式碼錯誤進行偵錯

如果您覺得原生程式碼錯誤傾印檔或空值標記難以理解,可參閱「Android 平台原生程式碼偵錯」這篇文章,以瞭解初步概念。

如需更完整的常見當機類型目錄和調查方法,請參閱「診斷原生當機事件」。

ndk-stack 工具可協助您針對錯誤進行符號化處理。 您可以按照「為應用程式偵錯」一般說明文件中的方法,在 Android Studio 中偵錯當機問題。如果想使用指令列,可以使用 ndk-gdb 從殼層附加 gdblldb

允許應用程式直接存取空值標記追蹤記錄

從 Android 12 (API 級別 31) 開始,您可以透過 ApplicationExitInfo.getTraceInputStream() 方法以通訊協定緩衝區形式存取應用程式的原生程式碼錯誤空值標記。通訊協定緩衝區使用這個結構定義進行序列化。 在此之前,您只能透過 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);
    }
}

對原生記憶體問題進行偵錯

Address Sanitizer (HWASan/ASan)

HWAddress Sanitizer (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) 擴充。

Android 6.0 (Marshmallow) 及以上版本支援 malloc_info 功能,其 XML 架構記錄在 Bionic 的 malloc.h 標頭中。

剖析

如需對原生程式碼進行 CPU 剖析,您可以使用 Simpleperf