Android JNI 异常定位(2)—— addr2line

本文介绍了Android设备中遇到信号11(SIGSEGV)报错时,如何利用/data/tombstones中的堆栈信息和addr2line工具定位子线程崩溃的问题,强调了addr2line在解析异常地址的重要性。

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

Android native报错有时候只有一句 signal 11 (SIGSEGV),这种情况仅通过log是很难定位到问题的。不过Android 在/data/tombstones目录保存了错误的堆栈信息,为定位bug提供了路径。不过一般这里的log都无法像java一样直接定位的出错的行数。如下图:

--------- beginning of crash
11-21 11:31:40.633 F/libc    ( 1127): Fatal signal 11 (SIGSEGV), code 1, fault addr 0xcbb45812 in tid 1260 (RenderThread)
11-21 11:31:40.633 W/        (  203): debuggerd: handling request: pid=1127 uid=1000 gid=1000 tid=1260
11-21 11:31:40.646 E/JNI_MANAGER( 1127): WebRtcAecm_BufferFarend
11-21 11:31:40.647 E/JNI_MANAGER( 1127): WebRtcAecm_BufferFarend
11-21 11:31:40.731 F/DEBUG   ( 2352): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-21 11:31:40.732 F/DEBUG   ( 2352): Build fingerprint: 'Android/rk3288/rk3288:7.1.2/NHG47K/zoeyli08041021:userdebug/test-keys'
11-21 11:31:40.732 F/DEBUG   ( 2352): Revision: '0'
11-21 11:31:40.733 F/DEBUG   ( 2352): ABI: 'arm'
11-21 11:31:40.734 F/DEBUG   ( 2352): pid: 1127, tid: 1260, name: RenderThread  >>> com.intercom.supervisor <<<
11-21 11:31:40.734 F/DEBUG   ( 2352): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xcbb45812
11-21 11:31:40.735 F/DEBUG   ( 2352):     r0 7f1d9fc0  r1 900f4ef8  r2 cbb457f2  r3 01000000
11-21 11:31:40.735 F/DEBUG   ( 2352):     r4 900f4f20  r5 7ed04880  r6 00000004  r7 00000001
11-21 11:31:40.736 F/DEBUG   ( 2352):     r8 7ed04830  r9 900f4f60  sl 900f4f20  fp 00000001
11-21 11:31:40.736 F/DEBUG   ( 2352):     ip a358dba8  sp 900f4ef0  lr a1d558b0  pc a1d5f518  cpsr 20070010
11-21 11:31:40.750 W/AudioFlinger(  234): RecordThread: buffer overflow
11-21 11:31:40.794 F/DEBUG   ( 2352): 
11-21 11:31:40.794 F/DEBUG   ( 2352): backtrace:
11-21 11:31:40.794 F/DEBUG   ( 2352):     #00 pc 0043e518  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.794 F/DEBUG   ( 2352):     #01 pc 004348ac  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.794 F/DEBUG   ( 2352):     #02 pc 00326090  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.794 F/DEBUG   ( 2352):     #03 pc 00323b1c  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.794 F/DEBUG   ( 2352):     #04 pc 00447a60  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.794 F/DEBUG   ( 2352):     #05 pc 00455750  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.795 F/DEBUG   ( 2352):     #06 pc 004503dc  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.795 F/DEBUG   ( 2352):     #07 pc 0044e8b8  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.795 F/DEBUG   ( 2352):     #08 pc 0044f18c  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.795 F/DEBUG   ( 2352):     #09 pc 0044f260  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.795 F/DEBUG   ( 2352):     #10 pc 003ab1ac  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.795 F/DEBUG   ( 2352):     #11 pc 0038664c  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.795 F/DEBUG   ( 2352):     #12 pc 00695288  /vendor/lib/egl/libGLES_mali.so
11-21 11:31:40.796 F/DEBUG   ( 2352):     #13 pc 0069e3bc  /vendor/lib/egl/libGLES_mali.so (eglMakeCurrent+1488)
11-21 11:31:40.796 F/DEBUG   ( 2352):     #14 pc 0000ac41  /system/lib/libEGL.so (_ZN7android13egl_display_t11makeCurrentEPNS_13egl_context_tES2_PvS3_S3_S3_S3_S3_+192)
11-21 11:31:40.796 F/DEBUG   ( 2352):     #15 pc 0000d497  /system/lib/libEGL.so (eglMakeCurrent+290)
11-21 11:31:40.796 F/DEBUG   ( 2352):     #16 pc 000263e9  /system/lib/libhwui.so
11-21 11:31:40.796 F/DEBUG   ( 2352):     #17 pc 0002667d  /system/lib/libhwui.so
11-21 11:31:40.796 F/DEBUG   ( 2352):     #18 pc 0002344b  /system/lib/libhwui.so
11-21 11:31:40.796 F/DEBUG   ( 2352):     #19 pc 00023339  /system/lib/libhwui.so
11-21 11:31:40.796 F/DEBUG   ( 2352):     #20 pc 000272e5  /system/lib/libhwui.so
11-21 11:31:40.797 F/DEBUG   ( 2352):     #21 pc 00028117  /system/lib/libhwui.so
11-21 11:31:40.797 F/DEBUG   ( 2352):     #22 pc 00028857  /system/lib/libhwui.so
11-21 11:31:40.797 F/DEBUG   ( 2352):     #23 pc 00029139  /system/lib/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread10threadLoopEv+80)
11-21 11:31:40.797 F/DEBUG   ( 2352):     #24 pc 0000e325  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+144)
11-21 11:31:40.797 F/DEBUG   ( 2352):     #25 pc 00067f29  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+80)
11-21 11:31:40.797 F/DEBUG   ( 2352):     #26 pc 00047323  /system/lib/libc.so (_ZL15__pthread_startPv+22)
11-21 11:31:40.797 F/DEBUG   ( 2352):     #27 pc 00019e5d  /system/lib/libc.so (__start_thread+6)
11-21 11:31:41.277 I/AudioFlinger(  234): BUFFER TIMEOUT: remove(4098) from active list on thread 0xad983d00
11-21 11:31:41.742 E/        ( 2352): debuggerd: failed to kill process 1127: No such process
11-21 11:31:41.748 W/        (  203): debuggerd: resuming target 1127
11-21 11:31:41.750 I/BootReceiver(  485): Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)
  • 先看崩溃的tid:1260,不是主线程,说明是子线程。
  • 最后一行/data/tombstones/tombstone_05提示异常日志保存在了tombstone_05文件里面
    在这里插入图片描述

backtrace需要借助Android ndk提供的addr2line工具来分析,从工具的名字就能看出来,这个东西可以帮我们把报错的地址指向代码行,以协助我们排查问题。
看工具的使用方式:

1.找到本地ndk路径下的addr2line的程序

我的路径“D:\Android\ndk\android-ndk-r10e\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin”
在这里插入图片描述
这里需要注意toolchains下根据系统架构区分多个目录,需要根据自己运行的系统进行区分,否则会报File format not recognized 错误。我的是64位系统,所以选了图示目录

在这里插入图片描述

2.打开命令行跳转至该目录

2.1、直接在路径下输入cmd,然后按enter键,就可以直接打开命令行窗口,并且跳转到该路径下面

在这里插入图片描述
在这里插入图片描述

3.使用addr2line -e命令

aarch64-linux-android-addr2line -e D:\Android\AndroidStudio\Project\ManagerJni\obj\local\armeabi\intercomManager.so 00019e5d

在这里插入图片描述

  • 红色1、so库必须是带有符号表的
  • 红色2、为异常的地址
  • 最后一行就转换出了异常所在的行
<think>嗯,用户想在Windows环境下使用addr2line工具,我需要先回忆一下addr2line的作用和相关配置步骤。addr2line主要是用来将程序崩溃时的地址转换成源代码的位置,帮助调试。根据用户提供的引用信息,引用[4]提到addr2line可以将地址转换为文件名、函数名和行号,这在处理崩溃时非常有用。 首先,用户需要知道如何在Windows上获取这个工具。根据引用[1]、[2]、[3],addr2line通常包含在交叉编译工具链里,比如ARM开发工具链或NDK中。比如,引用[3]指出NDK中的路径是ndk\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin,里面可能有arm-linux-androideabi-addr2line.exe这样的工具。所以用户需要安装NDK或者相关的工具链来获取该工具。 接下来,配置环境变量。用户可能需要将工具所在的目录添加到系统PATH中,或者在命令中直接指定完整路径。例如,如果工具在C:\ndk\...\bin目录下,可以通过cd命令进入该目录,或者使用绝对路径执行addr2line。 然后,使用命令时需要注意参数。根据引用[5],基本命令格式是addr2line -e <可执行文件> <地址>。在Windows中,可能需要使用反斜杠或双引号处理路径中的空格。例如,-e选项指定带符号的可执行文件(如ELF格式),然后输入地址。如果是动态库,可能需要使用对应的工具版本,如引用[2]提到的32位动态库使用arm-linux-androideabi-addr2line.exe。 还要注意,生成的可执行文件或库必须包含调试符号,即编译时使用-g选项,否则addr2line无法解析地址。用户可能遇到的问题是找不到符号,这时候需要确认是否编译时包含了调试信息。 另外,用户可能需要处理多个地址的情况,可以逐个输入或用管道传递。例如,在崩溃日志中有多个地址,可以用脚本批量处理。 总结步骤:安装工具链(如NDK),配置工具路径,使用正确的命令格式,并确保有调试符号。同时,用户可能需要根据不同的架构选择对应的addr2line版本,比如arm-none-eabi-addr2line或aarch64-linux-android-addr2line,如引用[1]、[3]所述。 最后,验证步骤是否正确,例如运行工具查看输出来源文件和行号。如果出现错误,检查路径是否正确,可执行文件是否匹配地址对应的架构,以及是否有调试信息。</think>### 如何在 Windows 系统中使用 addr2line 工具 #### 步骤 1: 获取 addr2line 工具 - **通过 NDK 工具链获取** 根据引用[3],addr2line 工具位于 NDK 的 `toolchains` 目录下,例如: `ndk\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe` 若需解析 32 位程序地址,使用 `arm-linux-androideabi-addr2line.exe`(引用[2])。 - **通过 ARM 开发工具链获取** 某些工具链(如 STM32 开发工具)可能包含 `arm-none-eabi-addr2line.exe`(引用[1])。 #### 步骤 2: 配置环境变量(可选) 将工具所在目录(如 NDK 的 `bin` 目录)添加到系统 `PATH` 环境变量,方便直接调用工具。 #### 步骤 3: 使用命令解析地址 基本命令格式为(引用[5]): ```bash addr2line.exe -e <可执行文件路径> <内存地址> ``` **示例**: ```bash aarch64-linux-android-addr2line.exe -e my_app 0x4009a8 ``` #### 步骤 4: 关键注意事项 1. **调试符号要求** 可执行文件或动态库需包含调试符号(编译时添加 `-g` 选项),否则无法解析源码位置(引用[4])。 2. **架构匹配** 工具需与程序架构一致(如 ARM、x86_64),否则解析结果错误。 *例如:ARM 程序需使用 `arm-linux-androideabi-addr2line.exe`(引用[2])。* 3. **路径处理** Windows 路径若含空格,需用双引号包裹: ```bash addr2line.exe -e "C:\Program Files\my_app\app.elf" 0x4009a8 ``` #### 验证示例 假设崩溃日志中的地址为 `0x804a3d`,使用 STM32 工具链解析: ```bash arm-none-eabi-addr2line.exe -e firmware.elf 0x804a3d ``` 输出结果为源码文件名和行号,例如: `main.c:42` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值