在進行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
注意事項:
必須將 Logcat 設置為 No Filter 才能看到全部錯誤信息,否則只看到 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 。
簡化方式,cd到build\intermediates\cmake\debug目錄下,輸入如下命令:
ndk-stack -sym obj/armeabi-v7a -dump obj/armeabi-v7a/crash.log