tombstone文件中fault addr deadbaad的由来

当Android应用遭遇Native级别的崩溃时,会在特定目录下生成tombstone文件。这些文件中记录了故障地址(deadbaad)等关键信息,有助于定位内存错误及堆栈溢出等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处: http://blog.youkuaiyun.com/zhangyang0402/article/details/16378353

android中发生native crash时,会在/data/tombstones/目录下生成tombstone文件。其中,错误的地方经常遇到fault addr deadbaad。如下:


signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
    r0 00000062  r1 deadbaad  r2 00000003  r3 00000063
    r4 401820f0  r5 00000000  r6 40194a4c  r7 00000000
    r8 4017e699  r9 4018d4e0  sl 4017e7e1  fp 00001250
    ip 00000000  sp 5e4ffaa8  lr 4016c47d  pc 4015837a  cpsr 00000030
    d0  4f2f49206b736920  d1  6f666e4965736165
    d2  0065005600270072  d3  006f006900730072
    d4  0061007400610044  d5  0065007300610062
    d6  006f0066006e0049  d7  0045004800570020
    d8  0000000000000000  d9  0000000000000000
    d10 0000000000000000  d11 0000000000000000
    d12 0000000000000000  d13 0000000000000000
    d14 0000000000000000  d15 0000000000000000
    d16 0000000000004bff  d17 ffffffffffffffff
    d18 0000000000004801  d19 0033006c00640032
    d20 0065006500350061  d21 006e007800680030
    d22 0000000000000004  d23 00690034006f0072
    d24 3fd99a27ad32ddf5  d25 3fe555b0aaeac752
    d26 0000000000000000  d27 0000000000000000
    d28 0000000000000005  d29 0000000000000000
    d30 0000000000000000  d31 0000000000000000
    scr 20000010

backtrace:
    #00  pc 0001437a  /system/lib/libc.so
    #01  pc 00015ded  /system/lib/libc.so (dlfree+372)
    #02  pc 00016edf  /system/lib/libc.so (free+10)
    ......

看了下代码,一般是在heap corrucption的时候,调用abort()->__libc_android_abort()

在__libc_android_abort()中,
{
    ......

    /* temporary, for bug hunting */
    /* seg fault seems to produce better debuggerd results than SIGABRT */
    *((char*)0xdeadbaad) = 39;
    /* -- */

    ......
}


故意向0xdeadbaad地址写数据,引起SIGSEGV错误。这样,我们在tombsone中就看到fault addr deadbaad了。


<think>我们正在分析Android的Tombstone日志。根据之前的对话和引用,我们已经介绍了解析方法和工具。用户现在想了解如何分析Tombstone日志,我们需要提供详细的分析步骤和关键点。 关键点: 1. Tombstone日志的产生:当Native层(C/C++代码)发生崩溃时,系统会生成Tombstone文件,保存在/data/tombstones/目录下(需要root权限访问)[^2][^3]。 2. 日志内容:包含崩溃信号、寄存器状态、堆栈回溯、内存映射等关键信息[^2][^4]。 3. 分析步骤:通常包括获取日志、准备符号文件、符号化堆栈、定位崩溃原因。 根据引用[4],详细分析Tombstone日志需要关注: - 崩溃信号(如SIGSEGV, SIGABRT等)和错误码(如SEGV_MAPERR, SEGV_ACCERR等) - 崩溃地址(fault addr) - 寄存器状态(特别是pc和lr寄存器) - 堆栈回溯(backtrace) - 内存映射(memory map near fault address) 我们按照以下结构回答: 一、获取Tombstone日志 二、理解Tombstone日志的结构 三、符号化堆栈回溯 四、分析崩溃原因 五、常见错误类型及解决方法 同时,生成相关问题。</think>### Tombstone日志分析详解 #### 一、获取与分析步骤 1. **获取日志文件** ```bash adb pull /data/tombstones/tombstone_00 # 需root权限 ``` 日志存储在设备`/data/tombstones/`目录,文件名如`tombstone_00`[^2] 2. **关键结构解析** ```log *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'Xiaomi/...' # 设备信息 Signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 # 崩溃信号 r0 00000000 r1 00000001 ... pc e9ed4c08 # 寄存器状态 backtrace: # 堆栈回溯(核心分析点) #00 pc 0001a234 /system/lib/libutils.so #01 pc 0000b5d8 /system/lib/libbinder.so memory map near fault addr 0x0: # 内存映射 00000000-00001000 r-- /dev/mem (deleted) ``` [^2][^4] --- #### 二、核心分析要点 1. **崩溃信号解析** - `SIGSEGV (signal 11)`:内存非法访问(空指针/越界) - `SIGABRT (signal 6)`:程序主动终止(assert失败) - `fault addr 0x0`:典型空指针访问[^4] 2. **寄存器关键值** - `pc`(程序计数器):崩溃时执行的指令地址 - `lr`(链接寄存器):函数返回地址 - `sp`(栈指针):当前栈位置 ```log pc 0001a234 lr 800b5d8 sp ff0000a0 ``` 3. **堆栈回溯分析** 使用符号文件解析地址: ```bash # 使用addr2line解析 arm-linux-androideabi-addr2line -e libutils.so 0001a234 # 输出:_ZNK7android6Parcel9readInt32Ev+24 (Parcel.cpp:120) ``` [^4] 4. **内存映射分析** ```log memory map near fault addr 0xdead0000: 12c00000-12d00000 rw- # 可读写内存段 40000000-40004000 r-x /system/lib/libc.so # 代码段 ``` 检查崩溃地址是否在合法内存范围内[^4] --- #### 三、符号化工具对比 | 工具 | 命令示例 | 适用场景 | |------|----------|----------| | **ndk-stack** | `ndk-stack -sym obj/local/armeabi-v7a/ -dump tombstone` | 快速完整解析 | | **addr2line** | `addr2line -e lib.so <address>` | 单地址解析 | | **GDB** | `gdb -ex "set solib-search-path symbols" -ex "target remote :1234"` | 动态调试 | | **stack脚本** | `./development/scripts/stack tombstone_00` | 需完整源码环境[^3] | > 示例:ndk-stack解析 > ```bash > ndk-stack -sym project/obj/local/armeabi-v7a/ -dump tombstone_00 > ``` --- #### 四、常见崩溃原因 1. **空指针访问** `fault addr 0x0` + `SIGSEGV code 1` → 解引用空指针 2. **内存越界** ```log signal 11 (SIGSEGV), code 2 (SEGV_ACCERR) fault addr 0x7f5d3a0000 # 非法地址 ``` 3. **栈溢出** `backtrace`中出现重复递归调用 4. **资源竞争** 多线程访问共享资源未加锁 --- #### 五、无源码环境分析技巧 1. 使用`objdump`反汇编: ```bash arm-linux-androideabi-objdump -d lib.so > disassembly.txt ``` 2. 在反汇编中搜索崩溃地址附近的指令 3. 结合寄存器状态分析内存操作指令(如`LDR`, `STR`) > ⚠️ 注意:符号文件必须与崩溃时的二进制完全匹配(编译版本、ABI架构)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值