Android NDK&JNI開發之Native崩潰日誌分析方法

在進行Android NDK開發的時候, 因爲代碼編寫導致崩潰的問題時有發生,但是問題在於,Native層的崩潰日誌,如果只看LogCat輸出的內容,我們會發現,根本無法進行分析和處理,因爲日誌內容中都是一大堆的內存地址信息。

原始錯誤日誌:

2020-08-20 18:04:01.149 27129-27129/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: Build fingerprint: 'HONOR/LLD-AL00/HWLLD-H:9/HONORLLD-AL00/9.1.0.140C00:user/release-keys'
2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: Revision: '0'
2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: ABI: 'arm'
2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: Happend: 'Thu Aug 20 18:04:01 2020
    '
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: SYSVMTYPE: Art
    APPVMTYPE: Art
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: pid: 26194, tid: 27088, name: Thread-1682  >>> com.renhui.maomaomedia <<<
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: Cause: null pointer dereference
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     r0  c8da4000  r1  00000000  r2  eed3a564  r3  40000000
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     r4  c58858f0  r5  c5885970  r6  c5885970  r7  c5885940
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     r8  00006652  r9  000069cd  r10 c92a626d  r11 c8da4000
2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     ip  c954dfa8  sp  c58858f0  lr  c92a641b  pc  c92a62a4
2020-08-20 18:04:01.153 27129-27129/? A/DEBUG: backtrace:
2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #00 pc 000192a4  /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (VideoHandler::decodeVideo()+28)
2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #01 pc 0001927b  /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (decodeVideoT(void*)+14)
2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #02 pc 00065ac7  /system/lib/libc.so (__pthread_start(void*)+22)
2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #03 pc 0001e9ad  /system/lib/libc.so (__start_thread+32)

Native日誌分析方式:

將LogCat輸出的Native崩潰日誌,拷貝到crash.log(注意:最好以星號這行開始),並複製到build目錄下的cmake編譯後的so文件目錄下,需要注意的是編譯目錄armeabi要和crash.log對應,cmake\debug\obj\arm-XXX目錄下要有so文件,這個是編譯的時候生成的。

例如,我們運行的so文件是armeabi-v7a下的,那麼拷貝到此下面,執行如下命令:

ndk-stack -sym C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\build\intermediates\cmake\debug\obj\armeabi-v7a -dump crash.log

然後我們就能看到帶文件名、函數名和行號的log日誌了,進而我們就可以進一步排查和修復問題了。

C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\build\intermediates\cmake\debug\obj>ndk-stack -sym C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\build\intermed
iates\cmake\debug\obj\armeabi-v7a -dump crash.log
********** Crash dump: **********
Build fingerprint: 'HONOR/LLD-AL00/HWLLD-H:9/HONORLLD-AL00/9.1.0.140C00:user/release-keys'
#00 0x000192a4 /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (VideoHandler::decodeVideo()+28)
                                                                                                         VideoHandler::decodeVideo()
                                                                                                         C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\.cxx\cmake\deb
ug\armeabi-v7a\../../../../src/main/cpp/player\VideoHandler.cpp:59:27
#01 0x0001927b /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (decodeVideoT(void*)+14)
                                                                                                         decodeVideoT(void*)
                                                                                                         C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\.cxx\cmake\deb
ug\armeabi-v7a\../../../../src/main/cpp/player\VideoHandler.cpp:20:19
#02 0x00065ac7 /system/lib/libc.so (__pthread_start(void*)+22)
#03 0x0001e9ad /system/lib/libc.so (__start_thread+32)
Crash dump is completed

 

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