arm-eabi-addr2line android应用崩溃的调试方法

本文介绍如何利用arm-linux-androdeabi-addr2line工具定位安卓应用崩溃的具体代码位置,通过分析logcat日志信息,结合配置和使用流程,帮助开发者高效定位问题根源。

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

1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如:

export PATH=$PATH:~/dlna/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin


2.使配置生效:source ~/.bashrc


3.使用工具。例如:arm-linux-androideabi-addr2line -C -f -e  ~/workspace/DLNA/libs/armeabi/libctrlpt.so 0003deb4

其中,0003deb4为堆栈信息中pc的值。

 

 

如下:通过logcat看到如下信息

01-02 12:57:57.750 I/DEBUG   (  104): backtrace:
01-02 12:57:57.750 I/DEBUG   (  104):     #00  pc 00007822  /system/lib/libdayo-gm500-ril.so
01-02 12:57:57.750 I/DEBUG   (  104):     #01  pc 000023ef  /system/lib/libril.so
01-02 12:57:57.750 I/DEBUG   (  104):     #02  pc 00005fb9  /system/lib/libril.so
01-02 12:57:57.750 I/DEBUG   (  104):     #03  pc 0000e3d8  /system/lib/libc.so (__thread_entry+72)
01-02 12:57:57.750 I/DEBUG   (  104):     #04  pc 0000dac4  /system/lib/libc.so (pthread_create+160)
01-02 12:57:57.760 I/DEBUG   (  104):
01-02 12:57:57.760 I/DEBUG   (  104): stack:
01-02 12:57:57.760 I/DEBUG   (  104):          405c3c98  00000014
01-02 12:57:57.760 I/DEBUG   (  104):          405c3c9c  00000018
01-02 12:57:57.760 I/DEBUG   (  104):          405c3ca0  c0000000
01-02 12:57:57.760 I/DEBUG   (  104):          405c3ca4  417685f0  [heap]
01-02 12:57:57.760 I/DEBUG   (  104):          405c3ca8  4011a371  /system/lib/libril.so (RIL_onRequestComplete)
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cac  401c34ec
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cb0  00000001
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cb4  4009a813  /system/lib/libc.so (dlfree+34)
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cb8  417685f0  [heap]
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cbc  38d1e63a
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cc0  417685f0  [heap]
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cc4  00000000
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cc8  400d4228
01-02 12:57:57.760 I/DEBUG   (  104):          405c3ccc  401a3779  /system/lib/libdayo-gm500-ril.so
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cd0  df0027ad
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cd4  00000000
01-02 12:57:57.760 I/DEBUG   (  104):     #00  405c3cd8  00000068
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cdc  00000001
01-02 12:57:57.760 I/DEBUG   (  104):          405c3ce0  4011cb74  /system/lib/libril.so
01-02 12:57:57.760 I/DEBUG   (  104):          405c3ce4  00000000
01-02 12:57:57.760 I/DEBUG   (  104):          405c3ce8  00000000
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cec  00000000
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cf0  00000000
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cf4  401af004  /system/lib/libdayo-gm500-ril.so
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cf8  00000000
01-02 12:57:57.760 D/dalvikvm(  493): GC_FOR_ALLOC freed 149K, 16% free 7817K/9200K, paused 67ms, total 69ms
01-02 12:57:57.760 I/DEBUG   (  104):          405c3cfc  0000000a
01-02 12:57:57.760 I/DEBUG   (  104):          405c3d00  401ab7aa  /system/lib/libdayo-gm500-ril.so
01-02 12:57:57.760 I/DEBUG   (  104):          405c3d04  401ab7c2  /system/lib/libdayo-gm500-ril.so
01-02 12:57:57.760 I/DEBUG   (  104):          405c3d08  00000008
01-02 12:57:57.760 I/DEBUG   (  104):          405c3d0c  400d4228
01-02 12:57:57.760 I/DEBUG   (  104):          405c3d10  41740370  [heap]
01-02 12:57:57.760 I/DEBUG   (  104):          405c3d14  00000000
01-02 12:57:57.760 I/DEBUG   (  104):          ........  ........
01-02 12:57:57.760 I/DEBUG   (  104):     #01  405c3e78  4011f800  /system/lib/libril.so
01-02 12:57:57.760 I/DEBUG   (  104):          405c3e7c  4011afbb  /system/lib/libril.so
01-02 12:57:57.760 I/DEBUG   (  104):     #02  405c3e80  00000aba
01-02 12:57:57.760 I/DEBUG   (  104):          405c3e84  4011d1ba  /system/lib/libril.so

..........

gaoshen@dayo-la:~/work/allwinner/A23_201310281051_RDAFM/A23_201310281051/android/out/target/product/polaris-p1/obj/SHARED_LIBRARIES/libdayo-gm500-ril_intermediates/LINKED$ arm-linux-androideabi-addr2line 00007822 -e  libdayo-gm500-ril.so
/home/gaoshen/work/allwinner/A23_201310281051_RDAFM/A23_201310281051/android/hardware/ril/reference-ril/reference-ril.c:4564

找到崩的地方。

 

 

<think>好的,我现在需要帮助用户解决如何使用arm-linux-androideabi-addr2line工具定位二进制文件中的地址到源码位置的问题。首先,我需要回忆一下addr2line的基本用法和相关参数。 用户提到的工具是arm-linux-androideabi-addr2line,这应该是Android NDK中的工具,用于ARM架构的二进制文件。用户有三个地址:0002b345、00034325、0003579c,需要找到对应的源码文件和行号。 首先,addr2line的基本命令格式是:arm-linux-androideabi-addr2line -e <二进制文件> <地址>。用户需要确保提供的二进制文件(比如factorytest)是包含调试信息的,也就是编译时使用了-g选项。如果二进制文件被strip过,可能无法获取到源码信息。 接下来,可能需要检查用户是否知道如何正确指定二进制文件的路径。例如,如果factorytest不在当前目录,用户需要给出完整路径或者正确的相对路径。 然后,地址的格式可能需要处理。addr2line接受的地址通常是十六进制,但用户给出的地址是否带有前缀(如0x)呢?比如,0002b345是否需要写成0x0002b345?根据经验,addr2line通常可以接受不带0x的十六进制数,但有时候可能需要添加。可能需要建议用户两种方式都试试。 另外,用户可能需要使用其他选项,比如-f来显示函数名,或者-C来demangle C++符号。这些选项是否必要?例如,如果代码是C++写的,-C可能会有帮助。但用户的问题中没有提到语言,可能需要默认不加,或者给出示例包含这些选项。 还需要考虑的是,是否需要在命令中同时处理多个地址。用户有三个地址,可以一次性传递还是需要逐个处理。在命令行中,可以同时添加多个地址,用空格分隔,所以命令可以是:arm-linux-androideabi-addr2line -e factorytest 0002b345 00034325 0003579c。 另外,用户可能遇到的常见问题包括:二进制文件没有调试信息、路径错误、地址无效或对应的代码被优化掉。需要提醒用户检查这些点,比如使用file命令查看二进制文件是否包含调试信息,或者使用objdump确认地址是否有效。 结合用户提供的引用内容,特别是引用[3]中提到u-boot的代码在cpu/arm920t/Nand_cp.c文件中,这可能与用户的问题无关,但需要确认是否有其他引用内容相关。例如,引用[1]讨论位置无关代码和地址加载,引用[3]提到Nand相关代码的位置,但用户的问题是关于addr2line的使用,所以这些引用可能只是提供背景,用户可能需要具体步骤。 总结步骤: 1. 确保二进制文件编译时带有调试信息(-g)。 2. 使用正确的工具路径和二进制文件路径。 3. 执行命令,地址可能需要0x前缀。 4. 处理可能的错误情况,如缺少调试信息。 可能需要给出具体示例命令,并解释每个参数的作用。同时,提醒用户如果地址对应的代码被优化,可能无法获得准确的源码位置,这时候可能需要减少优化级别重新编译。</think>### 使用`arm-linux-androideabi-addr2line`定位源码的步骤 1. **确认二进制文件包含调试信息** 确保目标二进制文件(如`factorytest`)在编译时添加了`-g`调试选项。可通过以下命令验证: ```bash file factorytest ``` 若输出中包含`with debug_info`或`not stripped`,则表示包含调试信息。若为`stripped`,需重新编译并保留符号表。 2. **基础命令格式** 使用以下命令定位地址对应的源码位置: ```bash arm-linux-androideabi-addr2line -e factorytest 0x0002b345 0x00034325 0x0003579c ``` - `-e factorytest`:指定目标二进制文件 - `0x0002b345`等地址:需添加`0x`前缀表示十六进制 3. **附加功能选项** - **显示函数名**:添加`-f`选项 ```bash arm-linux-androideabi-addr2line -e factorytest -f 0x0002b345 ``` - **解析C++符号**:添加`-C`选项 ```bash arm-linux-androideabi-addr2line -e factorytest -C 0x0002b345 ``` 4. **常见问题处理** - **地址无效或无信息**:若输出`??:0`,可能是地址错误、代码被优化或调试信息缺失。需检查编译参数并确保使用未优化(`-O0`)版本[^1][^3]。 - **路径问题**:若源码路径与编译时路径不一致,可使用`--base-dir`或`--prefix`参数调整路径映射。 --- ### 示例输出解析 假设执行命令后输出: ``` main /home/user/src/factory.c:123 ``` 表示地址`0x0002b345`对应`factory.c`文件的第123行,位于`main`函数中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值