debuggerd
是 Android 系統中的一個重要調試工具,主要用于生成進程崩潰時的核心轉儲(core dump)和調試信息(如堆棧跟蹤)。以下是關于 debuggerd
的詳細說明:
1. 基本功能
- 崩潰分析:當 Native 進程(C/C++ 代碼)崩潰時,
debuggerd
會捕獲信號(如SIGSEGV
、SIGABRT
),生成 tombstone 文件(墓碑文件),記錄崩潰時的堆棧、寄存器、內存映射等信息。 - 主動調試:支持主動附加到運行中的進程,生成堆棧跟蹤(無需崩潰)。
2. 主要命令
(1) 被動觸發(自動)
當進程崩潰時,系統會自動調用 debuggerd
生成 tombstone 文件,保存在 /data/tombstones/
目錄下(文件名如 tombstone_00
)。
(2) 主動調試
-
獲取進程堆棧
附加到正在運行的進程并打印堆棧:debuggerd -b <pid>
-b
:輸出簡要堆棧(否則生成完整 tombstone 文件)。
-
生成完整 tombstone 文件
debuggerd <pid>
輸出文件默認在
/data/tombstones/
。
(3) 高級選項
-
回溯特定線程
debuggerd -t <tid>
-t
:指定線程 ID(而非進程 ID)。
-
調用
gdbserver
附加調試debuggerd --wrapper gdbserver :5039 --attach <pid>
用于遠程 GDB 調試。
3. 關鍵文件路徑
- Tombstone 文件
/data/tombstones/tombstone_XX
(需 root 權限訪問)。 - Logcat 輸出
崩潰日志也會出現在logcat
中,搜索關鍵字DEBUG
或進程名。
4. 權限要求
- 查看其他進程的堆棧需要 root 權限 或
ptrace
能力。 - 普通應用只能調試自身進程。
5. 使用示例
(1) 捕獲崩潰
- 觸發一個 Native 崩潰(如空指針訪問)。
- 通過
logcat
或檢查/data/tombstones/
查看崩潰詳情。
(2) 主動獲取堆棧
adb shell
su
debuggerd -b <pid> # 替換為實際進程 ID
6. 分析 tombstone 文件
tombstone 文件包含以下關鍵信息:
- 信號(如
SIGSEGV
)。 - 堆棧跟蹤(包括庫和函數名)。
- 寄存器狀態(PC、SP 等)。
- 內存映射(
/proc/<pid>/maps
)。
使用 ndk-stack
工具(NDK 提供)可以符號化堆棧:
ndk-stack -sym <so文件路徑> -dump tombstone_00
7. 注意事項
- Android 版本差異:
- Android 8.0+ 使用
crash_dump
替代傳統debuggerd
,但命令兼容。
- Android 8.0+ 使用
- 性能影響:
頻繁附加調試可能導致進程短暫掛起。 - 安全限制:
非 root 設備可能無法調試系統進程。
8. 相關工具
ndk-stack
:符號化 tombstone 文件。addr2line
(NDK 工具鏈):解析具體代碼行。- GDB/LLDB:配合
gdbserver
進行動態調試。
如果需要進一步分析崩潰,建議結合源碼和編譯生成的符號文件(.so
或帶調試信息的二進制)。