当前位置: 首页 > news >正文

Android系统的问题分析笔记 - Android上的调试方式 debuggerd

debuggerd 是 Android 系统中的一个重要调试工具,主要用于生成进程崩溃时的核心转储(core dump)和调试信息(如堆栈跟踪)。以下是关于 debuggerd 的详细说明:

1. 基本功能

  • 崩溃分析:当 Native 进程(C/C++ 代码)崩溃时,debuggerd 会捕获信号(如 SIGSEGVSIGABRT),生成 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) 捕获崩溃

  1. 触发一个 Native 崩溃(如空指针访问)。
  2. 通过 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,但命令兼容。
  • 性能影响
    频繁附加调试可能导致进程短暂挂起。
  • 安全限制
    非 root 设备可能无法调试系统进程。

8. 相关工具

  • ndk-stack:符号化 tombstone 文件。
  • addr2line(NDK 工具链):解析具体代码行。
  • GDB/LLDB:配合 gdbserver 进行动态调试。

如果需要进一步分析崩溃,建议结合源码和编译生成的符号文件(.so 或带调试信息的二进制)。

http://www.lryc.cn/news/588132.html

相关文章:

  • 超导探索之术语介绍:费曼图(Feynman Diagram)
  • 【基础架构】——架构设计流程第三步(评估和选择备选方案)
  • 8.服务通信:Feign深度优化 - 解密声明式调用与现代负载均衡内核
  • 现代数据平台能力地图:如何构建未来数据平台的核心能力体系
  • LSV负载均衡
  • org.casic.javafx.control.PaginationPicker用法
  • 2025年北京市大学生程序设计竞赛暨“小米杯”全国邀请赛——D
  • 【从语言幻觉看趋势】从语言幻觉到多智能体协作:GPT多角色系统的技术演进与实践路径
  • MFC UI大小改变与自适应
  • MFC扩展库BCGControlBar Pro v36.2新版亮点:可视化设计器升级
  • Java集合和字符串
  • 如何通过API查询实时能源期货价格
  • 【机器学习深度学习】Ollama vs vLLM vs LMDeploy:三大本地部署框架深度对比解析
  • Function-——函数中文翻译渊源及历史背景
  • 重复频率较高的广告为何一直在被使用?
  • Three.js搭建小米SU7三维汽车实战(5)su7登场
  • 【世纪龙科技】汽车整车检测与诊断仿真实训系统-迈腾B8
  • Netty编程模型介绍
  • Olingo分析和实践——整体架构流程
  • 如何保护文件传输安全?文件传输加密
  • Mac下载mysql
  • 安装Keycloak并启动服务(macOS)
  • 概率论与数理统计(二)
  • 微信小程序——配置路径别名和省略后缀
  • 创客匠人:创始人 IP 打造的内核,藏在有效的精神成长里
  • 【第一章编辑器开发基础第一节绘制编辑器元素_6滑动条控件(6/7)】
  • 【PTA数据结构 | C语言版】字符串连接操作
  • Git安装避坑指南
  • 【Vue】Vue3.6 - Vapor 无虚拟DOM
  • 【第一章编辑器开发基础第二节编辑器布局_1水平与垂直布局(1/4)】