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.pswp.cn/news/914461.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 双下划线开头函数

在 Python 里&#xff0c;双下划线开头的函数&#xff08;准确地说是方法&#xff09;有着特殊的用途和意义。下面为你详细介绍相关内容&#xff1a; 1. 类的特殊方法&#xff08;魔术方法&#xff09; 以双下划线开头和结尾的方法&#xff0c;被称为特殊方法或者魔术方法&…

VyOS起步指南:用Docker快速搭建网络实验环境

文章目录1. VyOS是什么&#xff1f;为什么选择它&#xff1f;2. 五分钟快速部署&#xff1a;Docker方案3. 进入容器&#xff1a;初探VyOS世界4. 核心操作&#xff1a;像开发者一样思考5. 踩坑提醒&#xff1a;新手常见问题6. 结语&#xff1a;网络即代码的未来1. VyOS是什么&am…

动态规划理论基础,LeetCode 509. 斐波那契数 LeetCode 70. 爬楼梯 LeetCode 746. 使用最小花费爬楼梯

动态规划理论基础动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff…

暑期自学嵌入式——Day02(C语言阶段)

点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 主页&#xff1a; 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1000.2115.3001.5343 目录 Day02→数据类型&#xf…

如何单独安装设置包域名

前言 在 npm 中&#xff0c;直接通过 package-lock.json 无法单独设置包的安装地址&#xff0c;因为该文件是自动生成的依赖关系锁定文件。但你可以通过以下方法间接实现&#xff1a; 一、在 package.json 中指定包来源&#xff08;推荐&#xff09; 在 package.json 的 depend…

存储过程探秘:数据库编程的艺术

文章目录存储过程语法格式BEGIN...END语句块DECLARE&#xff08;声明局部变量&#xff09;流控制语句if函数批处理操作测试2测试3存储过程与函数的关系存储过程 MYSQL的存储过程是一组预处理的SQL语句&#xff0c;可以像函数一样在数据库中进行存储和调用。 它们允许在数据库…

非阻塞写入核心:asyncio.StreamWriter 的流量控制与数据推送之道

在 asyncio 的异步编程框架中&#xff0c;如果说 asyncio.StreamReader 是你异步应用的数据输入管道&#xff0c;那么 asyncio.StreamWriter 就是你异步应用的数据输出管道。它是一个至关重要的组件&#xff0c;让你能够方便、高效且非阻塞地向连接的另一端&#xff08;如 TCP …

控制台打开mysql服务报错解决办法

控制台打开mysql服务报错解决办法这个MySQL错误表示访问被拒绝&#xff0c;通常是因为没有提供正确的用户名和密码。以下是几种解决方法&#xff1a; 方法1&#xff1a;指定用户名和密码连接 mysql -u root -p然后输入root用户的密码。 方法2&#xff1a;如果忘记了root密码&am…

Unsloth 实战:DeepSeek-R1 模型高效微调指南(下篇)

食用指南 本系列因篇幅原因拆分为上下两篇&#xff1a; 上篇以基础环境搭建为主&#xff0c;介绍了 Unsloth 框架、基座模型下载、导入基座模型、数据集下载/加载/清洗、SwanLab 平台账号注册。 下篇&#xff08;本文&#xff09;以实战微调为主&#xff0c;介绍预训练、全量…

Ubuntu安装Jenkins

Ubuntu安装Jenkins方法1&#xff1a;使用官方的Jenkins仓库1. 添加Jenkins仓库2. 更新软件包列表3. 安装Jenkins4. 启动Jenkins服务5. 设置Jenkins开机启动6. 查找初始管理员密码7. 访问Jenkins方法2&#xff1a;使用Snap包&#xff08;适用于较新的Ubuntu版本&#xff09;1. 安…

ubuntu22.04下配置qt5.15.17开发环境

自从qt5.15版本开始&#xff0c;不再提供免费的离线安装包&#xff0c;只能通过源码自行编译。刚好最近需要在ubuntu22.04下配置qt开发环境&#xff0c;于是写篇文章记录配置的过程。 其实一开始是想配置qt5.15.2的&#xff0c;但是在编译配置参数这一步骤中出现如下报错 em…

S7-1200 与 S7-300 CPS7-400 CP UDP 通信 Step7 项目编程

S7-1200 CPU 与S7-300 CP STEP7 UDP通信S7-1200 与 S7-300 CP 之间的以太网通信可以通过 UDP 协议来实现&#xff0c;使用的通信指令是在S7-1200 CPU 侧调用通信-开放式用户通信TSEND_C&#xff0c;TRCV_C指令或TCON&#xff0c;TDISCON&#xff0c;TUSEND&#xff0c;TURCV 指…

基于YOLOv11的无人机目标检测实战(Windows环境)

1. 环境搭建 1.1 硬件与操作系统 操作系统&#xff1a;Windows 11 CPU&#xff1a;Intel i7-9700 GPU&#xff1a;NVIDIA RTX 2080&#xff08;8GB显存&#xff09; 1.2 安装CUDA和cuDNN 由于YOLOv11依赖PyTorch的GPU加速&#xff0c;需要安装CUDA和cuDNN&#xff1a; 安…

Spring Cloud分布式配置中心:架构设计与技术实践

从单体到微服务&#xff1a;Spring Cloud 开篇与微服务设计 Spring Cloud服务注册与发现&#xff1a;架构设计与技术实践深度分析 在以往分享中&#xff0c;码友们已经掌握了微服务的设计和注册中心的设计&#xff0c;部分聪明的码友已经察觉了&#xff0c;已经到了需要设计一个…

15.2 Common Criteria合规

目录1. Common Criteria简介1.1 CC评估要素1.2 CC与TF-A的关系2. TF-A的CC合规要求2.1 安全功能需求2.2 开发过程要求3. TF-A的CC合规实现3.1 关键安全机制3.2 开发流程控制4. CC认证实践指南4.1 认证准备步骤4.2 典型挑战与解决方案4.3 已认证案例参考5. 持续合规建议1. Commo…

【前端:Typst】--let关键字的用法

在 Typst 中&#xff0c;#let 命令是用于定义变量和函数的核心指令&#xff0c;其用法非常灵活。以下是详细的用法说明和示例。 目录 1.基础变量定义 2.函数定义 3.默认参数 4.内容块参数&#xff08;Content Blocks&#xff09; 5.递归函数 1.基础变量定义 // 定义简单…

Qt轮廓分析设计+算法+避坑

轮廓分析拟合方面我现在只考虑矩形拟合和圆形拟合细分的话&#xff0c;椭圆拟合&#xff0c;矩形拟合&#xff0c;最小外接矩形&#xff0c;最小外接圆。对于一张图像可能有不同的图形&#xff0c;不同的圆&#xff0c;不同的矩形&#xff0c;我需要对其进行筛选&#xff0c;也…

C++中STL六大组件List的简单介绍

一、前言C非常重视效率&#xff0c;对效率有损失的代码常常是能省则省。使用list要包含的头文件是<list>&#xff0c;要包含头文件就是#iinclude <list>&#xff0c;List肯定是一种链表&#xff0c;我们不妨回忆一下那种链表插入删除效率最快也就是最简单&#xff…

第十五节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - vue前端 生产部署

Vben Admin vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python …

背包初步(0-1背包、完全背包)

当月光洒在我的脸上 我想我就快变了模样 有一种叫做撕心裂肺的汤 喝了它有神奇的力量 动态规划初步&#xff08;完全背包&#xff09; 目录动态规划初步&#xff08;完全背包&#xff09;0-1背包简介完全背包检查数组是否存在有效划分&#xff08;前缀划分DP&#xff09;单词拆…