Android系统的问题分析笔记 - Android上的调试方式 debuggerd
debuggerd 是 Android 系统中的一个重要调试工具,主要用于生成进程崩溃时的核心转储(core dump)和调试信息(如堆栈跟踪)。以下是关于 debuggerd 的详细说明:
1. 基本功能
崩溃分析 :当 Native 进程(C/C++ 代码)崩溃时,debuggerd 会捕获信号(如 SIGSEGV、SIGABRT),生成 tombstone 文件(墓碑文件),记录崩溃时的堆栈、寄存器、内存映射等信息。
主动调试:支持主动附加到运行中的进程,生成堆栈跟踪(无需崩溃)。
2. 主要命令
(1) 被动触发(自动)
当进程崩溃时,系统会自动调用 debuggerd 生成 tombstone 文件,保存在 /data/tombstones/ 目录下(文件名如 tombstone_00)。
(2) 主动调试
获取进程堆栈
附加到正在运行的进程并打印堆栈:
bash
复制代码
debuggerd -b
-b:输出简要堆栈(否则生成完整 tombstone 文件)。
生成完整 tombstone 文件
bash
复制代码
debuggerd
输出文件默认在 /data/tombstones/。
(3) 高级选项
回溯特定线程
bash
复制代码
debuggerd -t
-t:指定线程 ID(而非进程 ID)。
调用 gdbserver 附加调试
bash
复制代码
debuggerd --wrapper gdbserver :5039 --attach
用于远程 GDB 调试。
3. 关键文件路径
Tombstone 文件
/data/tombstones/tombstone_XX(需 root 权限访问)。
Logcat 输出
崩溃日志也会出现在 logcat 中,搜索关键字 DEBUG 或进程名。
4. 权限要求
查看其他进程的堆栈需要 root 权限 或 ptrace 能力。
普通应用只能调试自身进程。
5. 使用示例
(1) 捕获崩溃
触发一个 Native 崩溃(如空指针访问)。
通过 logcat 或检查 /data/tombstones/ 查看崩溃详情。
(2) 主动获取堆栈
bash
复制代码
adb shell
su
debuggerd -b
6. 分析 tombstone 文件
tombstone 文件包含以下关键信息:
信号 (如 SIGSEGV)。
堆栈跟踪(包括库和函数名)。
寄存器状态(PC、SP 等)。
内存映射 (/proc/
使用 ndk-stack 工具(NDK 提供)可以符号化堆栈:
bash
复制代码
ndk-stack -sym
7. 注意事项
Android 版本差异 :
Android 8.0+ 使用 crash_dump 替代传统 debuggerd,但命令兼容。
性能影响 :
频繁附加调试可能导致进程短暂挂起。
安全限制 :
非 root 设备可能无法调试系统进程。
8. 相关工具
ndk-stack:符号化 tombstone 文件。
addr2line(NDK 工具链):解析具体代码行。
GDB/LLDB :配合 gdbserver 进行动态调试。
如果需要进一步分析崩溃,建议结合源码和编译生成的符号文件(.so 或带调试信息的二进制)。