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
或带调试信息的二进制)。