Android Tombstone/Crash的log分析和定位 addr2line工具的使用

同事的库崩溃,作者帮忙定位。通过adb将崩溃日志文件从/data/tombstones/目录拖到本地,打开tombstone文件找到最后崩溃位置。在NDK中找到addr2line工具,制作批处理文件,将so文件拷贝到指定位置,执行后可得到崩溃的具体函数,此次崩溃原因是double变量溢出。

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

这几天同事的一个库崩溃,基本要把他整崩溃了,试着帮他定位一下。

 

拿到日志

2019-05-14 11:51:53.638 28080-28080/? A/DEBUG: Build fingerprint: 'Android/rk3399_firefly_aio_lvds_mid/rk3399_firefly_aio_lvds_mid:8.1.0/OPM6.171019.030.B1/110155:userdebug/test-keys'
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG: Revision: '0'
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG: ABI: 'arm'
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG: pid: 27554, tid: 27848, name: Thread-6  >>>  <<<
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xfffffffc
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG:     r0 fffffff4  r1 00000000  r2 fffffffc  r3 ef62cae1
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG:     r4 c04df760  r5 c04df75c  r6 c04df730  r7 c04df5c8
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG:     r8 c04e7398  r9 c04e3638  sl c04df738  fp c04df730
2019-05-14 11:51:53.638 28080-28080/? A/DEBUG:     ip bec42cd4  sp c04df5b8  lr be2f7449  pc beadcce4  cpsr 80070030

E//system/bin/tombstoned: Tombstone written to: /data/tombstones/tombstone_6

注意最后一行,崩溃日志的位置。

通过 adb 执行:

adb root

adb pull /data/tombstones/    ./

这个目录下的文件把拖下来;如果是windows一般在C:\Users\Administrator 这个目录下:

打开 tombstone_6

Build fingerprint: 'rockchip/rk3399_firefly_aio_lvds_box/rk3399_firefly_aio_lvds_box:7.1.2/NHG47K/liangk08091540:userdebug/test-keys'
Revision: '0'
ABI: 'arm'
pid: 18192, tid: 19090, name: Thread-6  >>> com.xxxxxxx <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x40080000
    r0 00000000  r1 40080000  r2 c40c867c  r3 c3c03580
    r4 bf70e614  r5 bf70e618  r6 bf70e610  r7 bf70e5c8
    r8 c43c1259  r9 c39020b2  sl 450147b7  fp c3e48305
    ip 00000000  sp bf70a4c0  lr bcc8f8a5  pc bcc8faa0  cpsr 200e0030
    d0  4082607140000000  d1  c39020b2c40c867c
    d2  4097d5a644fb6438  d3  4082db99c351e161
    d4  4097d5a6c393a1ad  d5  3fe0aba344bead32
    d6  c078b1c7c3c569f9  d7  4082d251c3c03580
    d8  3e5236a04415a322  d9  3f055d1f43607d0f
    d10 c3e483053f000000  d11 c338f291c2cfd268
    d12 44788000c32745fe  d13 43f2dc184388ec46
    d14 426566c044c2c5c5  d15 c43c12593f541ab7
    d16 bfeeb31f445aa523  d17 bfeeb31f445aa523
    d18 3ff0000000000000  d19 3fa4f28315ad5a4e
    d20 3feeb0d7cea52a5b  d21 3c5a626331000000
    d22 3f7b6ca377b310c3  d23 0000000400000004
    d24 40001b8400000000  d25 3fd5558841f82cae
    d26 3f7b552b00000000  d27 3fdb6df51da55c96
    d28 000080c2000012a6  d29 0000c3e60000bafd
    d30 bff0000009e56e13  d31 00000000042444fb
    scr 80000013

backtrace:
    #00 pc 007eaaa0  /data/app/com.xxxxxx/lib/arm/libXXXXX.so (_Z15irPackageCheck2RN5boost10shared_ptrIN3pcl10PointCloudINS1_8PointXYZEEEEERSt6vectorIdSaIdEERN2cv3MatESA_R7CCuboid+1695)
    #01 pc 3ffffffd  <unknown>

这里我们主要需要 #00 pc 007eaaa0 这是最后崩溃的地方:

在NDK 中找到 arm-linux-androideabi-addr2line.exe(注意这个是 32位的,如果你是64,请用64位的

我的文件位置:E:\ndk\android-ndk-r17b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin

做一个批处理文件,把你的so 拷贝到这个文件,下面是批处理文件内容:

arm-linux-androideabi-addr2line.exe  -C -f -e libxxxx.so 007eaaa0
 pause

注意:libxxxx.so, 007eaaa0  替换成你的 so,和 pc address

执行可以得到崩溃的具体函数;

这个查了一下是 double 变量溢出了,唉不小心。

别人写的一个批处理文件不错 tool_addr2line.bat:

    @echo off  
    rem current direction  
    set cur_dir=%cd%
      
    rem addr2line tool path  
    set add2line_path=E:\ndk\android-ndk-r17b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line.exe
      
    rem debug file  
    set /p debug_file=input debug filename:
      
    rem debug_file_path  
    set debug_file_path=%cur_dir%\%debug_file%  
      
    rem debug address  
    set /p debug_addr=PC address:
      
    echo ----------------------- addr2line ------------------------  
    echo debug file path: %debug_file_path%  PC=%debug_addr%  
      
    if exist %debug_file_path% (  
    %add2line_path% -e %debug_file_path% -f %debug_addr%   
    ) else (  
    echo debug file is no exist.   
    )  
      
    echo ---------------------------------------------------------  
    pause  

一个更全的:

https://www.cnblogs.com/CoderTian/p/5980426.html

<think>首先,用户的问题是:“安卓稳定性NE问题的解决中addr2line使用方法”。我需要用中文回答。问题涉及在安卓稳定性问题中(NE可能指Native Exception,即本地异常)使用addr2line工具的方法。 addr2line是一个调试工具,用于将地址转换为源代码行号,这在调试崩溃日志时非常有用,尤其是在安卓开发中处理native代码崩溃时。 我的回答应该包括: 1. 解释addr2line是什么。 2. 描述在安卓稳定性问题中如何使用它,特别是针对NE(Native Exception)问题。 3. 提供具体的步骤或示例。 4. 确保回答是中文的。 在回答后,必须提出3-5个相关问题,以“§§相关问题§§”开头,并在同一行列出问题,禁止换行分散。格式如示例所示:第一行是“§§相关问题§§”,然后是1. ··· 2. ··· 3. ···等。 示例中,回答部分有代码块,但用户问题没有代码,所以我需要根据问题调整。用户的问题是文本描述,所以我应该提供文本解释。 关键点: - 回答要完整。 - 结束时必须有“§§相关问题§§”,后跟3-5个相关问题。 - 相关问题必须基于用户的问题我的回答。 现在,构建回答: 1. **介绍addr2line**:addr2line是GNU Binutils中的工具,用于将地址映射到源代码行号。 2. **在安卓中的使用**:在安卓开发中,当app崩溃时,会生成崩溃日志(如tombstone文件),其中包含native代码的地址。addr2line可以帮助定位这些地址对应的代码行。 3. **步骤**: - 获取崩溃日志中的地址。 - 使用带符号表的库文件(如.so文件)。 - 运行addr2line命令。 4. **示例命令**:例如,`addr2line -e /path/to/libnative.so 0x12345678`。 确保回答清晰、简洁。 然后,提出相关问题: - 基于用户的问题:安卓稳定性、NE问题、addr2line使用。 - 可能的方面:如何获取符号表?如何处理多个地址?其他相关工具? - 列出3-5个问题。 相关问题的想法: 1. 如何获取安卓崩溃日志中的地址? 2. 什么是符号表文件,如何生成? 3. addr2line在哪些情况下无法提供有效信息? 4. 有没有其他工具可以替代或补充addr2line? 5. 在安卓开发中,如何集成addr2line到调试流程? 最终,回答结构: - 回答部分。 - 然后一行“§§相关问题§§”后跟问题列表。 用中文写。</think>在安卓稳定性问题中,NE(Native Exception)通常指本地代码(如C/C++)引发的崩溃,addr2line是一个调试工具,用于将崩溃日志中的内存地址转换为源代码文件路径行号,从而帮助定位问题源头。以下是使用addr2line解决NE问题的基本方法: ### 使用步骤: 1. **获取崩溃日志**:从安卓设备或日志文件(如`tombstone_XX`)中提取崩溃地址。例如,日志中可能包含类似`#00 pc 00012345 libnative.so`的行,其中`00012345`是地址。 2. **准备符号表文件**:使用带调试符号的库文件(如`.so`文件),通常从编译产物(如NDK构建的`obj/local/arm64-v8a/libnative.so`)获取。 3. **运行addr2line命令**:在终端执行命令,格式为: ```bash addr2line -e /路径/to/libnative.so 地址 ``` 例如: ```bash addr2line -e ./libnative.so 0x12345 ``` 输出如`/path/to/source.c:123`,表示源文件行号。 4. **处理多个地址**:如果日志有多个地址,可逐一运行或使用脚本批量处理。 ### 注意事项: - **NDK工具链**:确保addr2line来自安卓NDK(路径如`$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line`)。 - **调试符号**:发布版本可能缺少符号,需使用带`-g`编译的库。 - **常见错误**:地址无效或符号文件不匹配时,输出可能为`??:0`,需检查日志文件版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值