NDK調(diào)試方法

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ù),我們就可以仔細(xì)排查一下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 的輸出中時過濾它們。 它還可以從源代碼將共享庫中的任意地址替換為對應(yīng)的< 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

轉(zhuǎn)換為帶文件名、函數(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,首先,需要一個包含應(yīng)用共享庫的符號版本。 如果使用 NDK 構(gòu)建系統(tǒng) (ndk-build),則這些共享庫文件位于 $PROJECT_PATH/obj/local/ 下,其中 表示您的設(shè)備的 ABI。 默認(rèn)情況下,系統(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 輸出時將查找第一行星號。例如:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

注:在復(fù)制/粘貼log時,請別忘了此行,否則 ndk-stack 無法正常工作。

系統(tǒng)庫路徑

out/target/product/ac8x_car/symbols/system/lib64/libatcmultimedia.so

在symbols中的庫帶有編譯時的源碼,需要注意的是,拷貝的so需要和問題的so為同一代碼版本,否則定位出錯或不準(zhǔn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://www.baidu.com/sqlmap/mysql/test.php?id=1 當(dāng)給sqlmap這...
    Gundy_閱讀 1,087評論 0 0
  • sqlmap用戶手冊 說明:本文為轉(zhuǎn)載,對原文中一些明顯的拼寫錯誤進(jìn)行修正,并標(biāo)注對自己有用的信息。 ======...
    wind_飄閱讀 2,205評論 0 5
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 當(dāng)給sq...
    xuningbo閱讀 10,559評論 2 22
  • 1.什么是tombstone當(dāng)一個動態(tài)庫(native 程序)開始執(zhí)行時,系統(tǒng)會注冊一些連接到 debuggerd...
    小裁縫在海邊走著閱讀 2,898評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139

友情鏈接更多精彩內(nèi)容