文章目錄
-
- 1. 手動跟進crash
- 2.google Breakpad
1. 手動跟進crash
首先我們先手動寫一個錯誤,在裡面寫入如下代碼:
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
......
int * p = NULL;
*p = 100;
return JNI_VERSION_1_6;
}
運作程式,發現崩潰了,然後檢視LogCat:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1ITMzQjNwAjM2EDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
com.hgy413.ndkdemo
是崩潰的APK的包名。
完全看不懂上面的資訊,我們需要用到是
ndk-stack
工具,它在我們的ndk根目錄下,它可以幫助我們把上面的資訊轉化為更為易懂更詳細的報錯資訊,下面看看怎麼做:
- 切換到
中的指令行,輸入AndroidStudio
,然後我們就可以在項目根目錄下看到adb logcat > log.txt
NDKDemo\log.txt
檔案,打開
搜尋上面的
,即可得到以下内容:fault addr 0x0 in tid 19118
--------- beginning of crash
04-16 20:06:09.874 19118 19118 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 19118 (.hgy413.ndkdemo)
..................................// todo 這部分删除
04-16 20:06:10.140 19137 19137 F DEBUG : backtrace:
04-16 20:06:10.141 19137 19137 F DEBUG : #00 pc 0000000000016a44 /data/app/com.hgy413.ndkdemo-1/lib/arm64/libva++.so (JNI_OnLoad+116)
04-16 20:06:10.141 19137 19137 F DEBUG : #01 pc 00000000002f2c34 /system/lib64/libart.so (_ZN3art9JavaVMExt17LoadNativeLibraryEP7_JNIEnvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectP8_jstringPS9_+2136)
04-16 20:06:10.141 19137 19137 F DEBUG : #02 pc 000000000000427c /system/lib64/libopenjdkjvm.so (JVM_NativeLoad+280)
04-16 20:06:10.141 19137 19137 F DEBUG : #03 pc 00000000005de630 /system/framework/arm64/boot.oat (offset 0x54e000) (java.lang.Runtime.nativeLoad+204)
04-16 20:06:10.141 19137 19137 F DEBUG : #04 pc 00000000005de0d0 /system/framework/arm64/boot.oat (offset 0x54e000) (java.lang.Runtime.doLoad+204)
04-16 20:06:10.141 19137 19137 F DEBUG : #05 pc 00000000005dff00 /system/framework/arm64/boot.oat (offset 0x54e000) (java.lang.Runtime.loadLibrary0+748)
04-16 20:06:10.141 19137 19137 F DEBUG : #06 pc 0000000000601e24 /system/framework/arm64/boot.oat (offset 0x54e000) (java.lang.System.loadLibrary+96)
這裡可以基本看到是崩在
JNI_OnLoad+116
處。
- 繼續在
中的指令行中輸入如下指令(在這之前,我們要将AndroidStudio
的路徑添加到環境變量,以便于我們在指令行中直接使用它,當然,你也可以寫全路徑):ndk-stack
......>C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\ndk-stack -sym lib\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a -dump ./log.txt
********** Crash dump: **********
Build fingerprint: 'Xiaomi/santoni/santoni:7.1.2/N2G47H/9.4.11:user/release-keys'
#00 0x0000000000016a44 /data/app/com.hgy413.ndkdemo-1/lib/arm64/libva++.so (JNI_OnLoad+116)
JNI_OnLoad
C:/H/project/AndroidX/luluboxtest/NDKDemo/lib/src/main/myjni\Environment.cpp:21:8
#01 0x00000000002f2c34 /system/lib64/libart.so (_ZN3art9JavaVMExt17LoadNativeLibraryEP7_JNIEnvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectP8_jstringPS9_+2136)
#02 0x000000000000427c /system/lib64/libopenjdkjvm.so (JVM_NativeLoad+280)
#03 0x00000000005de630 /system/framework/arm64/boot.oat (offset 0x54e000) (java.lang.Runtime.nativeLoad+204)
-dump
參數很容易了解, 即dump下來的
log
文本檔案.
ndk-stack
會分析此檔案,即前面
adb logcat > log.txt
生成的
log.txt
檔案。
-sym
參數就是你android項目下,編譯成功之後,
obj
目錄下的檔案,如
lib\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a
,找不到就直接在本項目下搜
obj
關鍵字。
libs目錄下生成的庫是剝離了符号表與調試資訊的,而 obj
下的庫是帶有調試資訊的。
- 上面的兩步可以合成一步:
.......>adb logcat | C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\ndk-stack -sym lib\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a
********** Crash dump: **********
Build fingerprint: 'Xiaomi/santoni/santoni:7.1.2/N2G47H/9.4.11:user/release-keys'
#00 0x0000000000016a44 /data/app/com.hgy413.ndkdemo-1/lib/arm64/libva++.so (JNI_OnLoad+116)
JNI_OnLoad
C:/H/project/AndroidX/luluboxtest/NDKDemo/lib/src/main/myjni\Environment.cpp:21:8
......
myjni\Environment.cpp:21:8
準确的指出了發生錯誤的行數: