Android Process Crash Debug

Tombstone

在 Android 系統中, 如果 process 整個 crash 死亡, 系統會幫它建墓碑, 墓碑會放在 /data/tombstones/ 資料夾, 裡面會有 0 ~ 9 共十個墓碑, 當有超過十個 process 都 crash 時, 墓碑裡的資料會被新的覆蓋。 墓碑裡是存文字檔案, 會儲存 process 的整個記憶體狀況, 包含讀進來的 shared library 或是相關執行的 symbol, 後續可以用工具整理分析問題。

要知道自己的 process 被分配到哪個 tombstone 可以用 logcat 尋找, logcat 中尋找關鍵字 Fatal 就是有 process crash 發生, 接下來也會輸出正在使用的 tombstone。

ndk-stack

在 Android NDK 中有個工具叫 ndk-stack , 可以用來輔助分析 tombstone, 使用方法如下:

ndk-stack -sym <root_folder_for_symbols> -dump <tombstonefile>

指定好要使用的資料夾後, ndk-stack 會去整理 tombstone 裡的 call stack, 並且根據 address 所在的 library 去指定的資料夾內搜尋, 從中找到 library 並讀取相關 symbol, 最後輸出整理過的結果。

addr2line

addr2line 可以用來把某個記憶體位置轉成有意義的 symbol, 例如:

aarch64-linux-android-addr2line -f -e lib/libglib-2.0.so 00000000000cdab4