使用addr2line命令定位到行号解析.so的文件

一、背景



最新遇到crash 的问题 ,这里来简单说明怎么使用addr2line 命令来定位问题

首先获取到tombstone log

找到出现的位置如下log 

Process Name: 'UNKNOWN'

Thread Name: ''

pid: 3124, tid: 3124  >>> UNKNOWN <<<

killed by pid: 1, comm: UNKNOWN, uid: 0.

signal 15 (SIGTERM), code 0 (?), fault addr --------

r0 fffffffc  r1 ffd0e538  r2 00000010  r3 00007b20

r4 00000000  r5 00000008  r6 00000000  r7 0000015a

r8 f2ab269c  r9 00000008  10 f2ab2650  fp 00007b20

ip ffd0e4d0  sp ffd0e4c0  lr f2e33339  pc f2e605a0  cpsr 20070010

#00  pc 000485a0  /system/lib/libc.so

#00  pc 000485a0  /system/lib/libc.so

#01  lr 0001b339  /system/lib/libc.so

 --- --- ---

[DEBUG] Read self maps instead! map: 0x0

00 pc 000485a0  /system/lib/libc.so (__epoll_pwait+20)

01 pc 0001b337  /system/lib/libc.so (epoll_pwait+38)

 --- --- --- ---

从上面我们可以看到出现问题的在libc.so 这个库文件

二、找到对应的库文件

一版系统编译的这些库都会放到 

\out\target\product\product_name\system\lib\下面  

对应的在out\target\product\product_name\symbols\system\lib\也有一个

我们需要解析是在这个目录下的out\target\product\product_name\symbols\system\lib\的库文件


三、使用addr2line工具分析

这个工具在不同的android 平台上,放置的位置和名称有些区别

anroid 7.0 

prebuilts\gcc\linux-x86\aarch64\aarch64-linux-android-4.9\bin\aarch64-linux-android-addr2line

prebuilts\gcc\darwin-x86\aarch64\aarch64-linux-android-4.9\bin\aarch64-linux-android-addr2line

如:android 8.1 位置如下

prebuilts\gcc\linux-x86\aarch64\aarch64-linux-android-4.9\bin\aarch64-linux-android-addr2line

android 9.0 位置在 

\prebuilts\gcc\linux-x86\aarch64\aarch64-linux-android-4.9\bin\aarch64-linux-android-addr2line

我们今天分析是在8.1上面对应的位置为:

prebuilts\gcc\linux-x86\aarch64\aarch64-linux-android-4.9\bin\aarch64-linux-android-addr2line


四、操作步骤

a、我们以andriod 8.1 的为案例:

首先切换到代码的根目录:

如 anroid_home#

b、使用命令定位

使用命令 aarch64-linux-android-addr2line -f -e  +库名称 +地址

上面的地址为: 000485a0   000485a0  

 0001b339   0001b337  

c、结果显示

$ ./prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -f -e out/target/product/msm8953_64/symbols/system/lib/libc.so 000485a0

__epoll_pwait

/proc/self/cwd/bionic/libc/arch-arm/syscalls/__epoll_pwait.S:16

 ./prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -f -e out/target/product/msm8953_64/symbols/system/lib/libc.so 0001b339

epoll_pwait

bionic/libc/bionic/epoll_pwait.cpp:?

./prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -f -e out/target/product/msm8953_64/symbols/system/lib/libc.so 0001b337

epoll_pwait

bionic/libc/bionic/epoll_pwait.cpp:42


五、结果分析

通解析库文件--找源码的位置-分析源码

找出问题的根源。


推荐阅读更多精彩内容