1.addr2line
根據(jù)Android崩潰日志定位問題出處
崩潰日志一般都會有如下形式打印
I/DEBUG ? ( ?155): backtrace:
I/DEBUG ? ( ?155): ? ? #00 ?pc 00000000 ?<unknown>
I/DEBUG ? ( ?155): ? ? #01 ?pc 002248d9 ?/data/data/com.x.x.x/lib/libx.so (CTest::onRequest(int, _tagASSIST_SERVER*)+16)
其實這個就是崩潰棧二鳄,通常都指明了出問題的函數(shù),我們就可以仔細排查一下CTest::onRequest函數(shù)。
也可以通過命令 (002248d9就是libx.so中某個函數(shù)的地址)
arm-linux-androideabi-addr2line.exe -C -f -e libx.so 002248d9 來定位出問題的函數(shù)
2.NDK-STACK
ndk-stack 工具讓您可以在堆疊追蹤出現(xiàn)在 adb logcat 的輸出中時過濾它們影所。 它還可以從源代碼將共享庫中的任意地址替換為對應的< source-file: < line-number> 值,從而更容易找出問題所在僚碎。
例如猴娩,它可將下面的crash log:
I/DEBUG? (31):************************************************I/DEBUG? (31): Build fingerprint:'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'I/DEBUG? (31): pid:351, tid:351%gt;%gt;%gt; /data/local/ndk-tests/crasher<<<I/DEBUG? (31): signal11(SIGSEGV), fault addr0d9f00d8I/DEBUG? (31):? r00000af88? r10000a008? r2 baadf00d? r30d9f00d8I/DEBUG? (31):? r400000004r50000a008? r60000af88? r700013c44I/DEBUG? (31):? r800000000r9000000001000000000fp00000000I/DEBUG? (31):? ip0000959c? sp be956cc8? lr00008403pc0000841e? cpsr60000030I/DEBUG? (31):#00pc0000841e? /data/local/ndk-tests/crasherI/DEBUG? (31):#01pc000083fe? /data/local/ndk-tests/crasherI/DEBUG? (31):#02pc000083f6? /data/local/ndk-tests/crasherI/DEBUG? (31):#03pc000191ac? /system/lib/libc.soI/DEBUG? (31):#04pc000083ea? /data/local/ndk-tests/crasherI/DEBUG? (31):#05pc00008458/data/local/ndk-tests/crasherI/DEBUG? (31):#06pc0000d362? /system/lib/libc.so
轉換為帶文件名、函數(shù)名和行號的log:
**********Crash dump:**********Build fingerprint:'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'pid:351, tid:351>>>/data/local/ndk-tests/crasher<<<signal11(SIGSEGV), fault addr0d9f00d8Stackframe#00pc0000841e? /data/local/ndk-tests/crasher : Routine zooin/tmp/foo/crasher/jni/zoo.c:13Stackframe#01pc000083fe? /data/local/ndk-tests/crasher : Routine barin/tmp/foo/crasher/jni/bar.c:5Stackframe#02pc000083f6? /data/local/ndk-tests/crasher : Routine my_comparisonin/tmp/foo/crasher/jni/foo.c:9Stackframe#03pc000191ac? /system/lib/libc.soStackframe#04pc000083ea? /data/local/ndk-tests/crasher : Routine fooin/tmp/foo/crasher/jni/foo.c:14Stackframe#05pc00008458/data/local/ndk-tests/crasher : Routine mainin/tmp/foo/crasher/jni/main.c:19Stackframe#06pc0000d362? /system/lib/libc.so
用法
若要使用 ndk-stack勺阐,首先胀溺,需要一個包含應用共享庫的符號版本。 如果使用 NDK 構建系統(tǒng) (ndk-build)皆看,則這些共享庫文件位于 $PROJECT_PATH/obj/local/ 下仓坞,其中 表示您的設備的 ABI。 默認情況下腰吟,系統(tǒng)使用 armeabi ABI无埃。
可通過兩種方式使用此工具∶停可以將 logcat 文本作為直接輸入發(fā)送到程序嫉称。例如:
adb logcat|$NDK/ndk-stack-sym$PROJECT_PATH/obj/local/armeabi
也可以使用 -dump 選項將 logcat 指定為輸入文件。例如:
adb logcat>/tmp/foo.txt$NDK/ndk-stack-sym$PROJECT_PATH/obj/local/armeabi-dumpfoo.txt
該工具在開始解析 logcat 輸出時將查找第一行星號灵疮。例如:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
注:在復制/粘貼log時织阅,請別忘了此行,否則 ndk-stack 無法正常工作震捣。
系統(tǒng)庫路徑
out/target/product/ac8x_car/symbols/system/lib64/libatcmultimedia.so
在symbols中的庫帶有編譯時的源碼荔棉,需要注意的是,拷貝的so需要和問題的so為同一代碼版本蒿赢,否則定位出錯或不準润樱。