使用addr2line對JNI的Crash堆棧信息分析

目的:使用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:輸出版本號。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章