目的:使用addr2line对库中的崩溃定位到具体的代码行
步骤:
1.获取崩溃产生的记录堆栈信息的墓碑文件tombstone
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'alps/full_nb6797_6c_m/nb6797_6c_m:6.0/MRA58K/1583238338:user/test-keys'
Revision: '0'
ABI: 'arm'
pid: 19790, tid: 20058, name: (START_ROUTINE) >>> com.hikvision.voicelib <<<
signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xf371ae1c
r0 00000001 r1 e8771a40 r2 7fff485e r3 7fff485e
r4 f383c203 r5 de5bf930 r6 eed63dc8 r7 e902e4a0
r8 f387c898 r9 00000000 sl de57f000 fp de5bf888
ip de5bea68 sp de5bf7a0 lr f75b6861 pc f371ae1c cpsr 600f0010
d0 0000000000000000 d1 6966207369206469
d2 535b5d7070632e73 d3 6e61725474726168
d4 726874505b5d7070 d5 727474615f646165
d6 636174737465735f d7 30342c657a69736b
d8 0000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 0000000000000000 d17 0000000000000000
d18 0000000000000000 d19 3ff0000000000000
d20 40083e0f83e0f83e d21 0000000000000000
d22 0000000000000000 d23 0000000000000000
d24 00000000c7de0000 d25 0000000000000000
d26 0000000000000000 d27 0000000000000000
d28 000000000000c7de d29 0000000000000000
d30 000000000000c7de d31 0000000000000000
scr 20000010
backtrace:
#00 pc 001d7e1c /data/app/com.hikvision.voicelib-2/lib/arm/libaudioaiadapt.so (_ZN13C_TransClient17StartTransSessionEv+464)
#01 pc 001ddd54 /data/app/com.hikvision.voicelib-2/lib/arm/libaudioaiadapt.so (_ZN16C_AudioServerMng17CreateTransClientEv+104)
#02 pc 001ddc80 /data/app/com.hikvision.voicelib-2/lib/arm/libaudioaiadapt.so (_ZN16C_AudioServerMng22CreateTransClientShellEPv+28)
#03 pc 001e44c8 /data/app/com.hikvision.voicelib-2/lib/arm/libaudioaiadapt.so
#04 pc 0004078b /system/lib/libc.so (_ZL15__pthread_startPv+30)
#05 pc 0001a031 /system/lib/libc.so (__start_thread+6)
stack:
de5bf760 00000000
de5bf764 00000000
de5bf768 00000000
de5bf76c 00000000...
2.找到NDK中工具,我的路径是:C:\Users\sylv\AppData\Local\Android\Sdk\ndk-bundle\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe
3.使用工具分析出现问题的库文件,可从堆栈信息中看到是libaudioaiadapt.so出现了问题,对应的地址为001ddc80,那么输入命令C:\Users\sylv\AppData\Local\Android\Sdk\ndk-bundle\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe -C -f -e D:\00AndroidStudioProject\SVN\Tool\Viocelib\voicesdk\src\main\jniLibs\armeabi-v7a\libaudioaiadapt.so 001ddc80
对应输出:
参数说明:
参数
-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=<bfdname>:指定目标文件的格式为bfdname。
-e --exe=<executable>:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --section=<name>:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号。