NDK的crash与java不同,无法看到报错的具体位置,极端情况下甚至只有一句log。如下面这种
Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x76c229b8e8 in tid 23230 (ImageTester:), pid 23186
在网上查了不少文章,有的写的很多,但却不怎么实用,有的则是给出的路径错误,这里简单记载下可用的命令。
除了使用打log那种笨方法,ndk的crash需要用到ndk-stack,位于NDK的安装目录下,比如我自己的ndk-stack位于 D:\Android\sdk\ndk\22.0.7026061,也可以在ndk-bundle目录中找到。
还需要知道的是so文件所在的路径,网上很多文章给出的路径是错误的,在android studio的项目中,正确的路径位于 $PROJECT_PATH\app\build\intermediates\cmake\debug\obj\arm64-v8a (如果是其它CPU架构,可能是armeabi-v7a, x86等)
Android studio切换到Terminal窗口,执行以下命令:
adb logcat | ndk-stack -sym $PROJECT_PATH\app\build\intermediates\cmake\debug\obj\arm64-v8a
然后就可以看到crash相关的log,但这种方法有时候也无法得到正确的信息,原因未知。下面是执行命令后打出的log
********** Crash dump: **********
Build fingerprint: 'Xiaomi/polaris/polaris:10/QKQ1.190828.002/V12.0.2.0.QDGCNXM:user/release-keys'
#00 0x00000000001bd878 /data/app/com.aa.bb-bLyZl4qA6krwTv8tyF3F5Q==/lib/arm64/libnative-lib.so (fcvMemAlloc+56) (BuildId: b88c557d803fa97f9476f567d89d201ae7125d
00)
fcvMemAlloc
??:0:0
#01 0x000000000005e2bc /data/app/com.aa.bb-bLyZl4qA6krwTv8tyF3F5Q==/lib/arm64/libnative-lib.so (Java_com_aa_bb_util_ImageProcessor_getMixPixes+1320)
(BuildId: b88c557d803fa97f9476f567d89d201ae7125d00)
Java_com_aa_bb_util_ImageProcessor_getMixPixes
D:/project_list/bb/app/src/main/cpp\native-lib.cpp:169:65......
......#14 0x00000000005a1158 /apex/com.android.runtime/lib64/libart.so (MterpInvokeVirtual+1352) (BuildId: 8b52ee5427994d5851b0f85a2c15eedf)
#15 0x0000000000131814 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_virtual+20) (BuildId: 8b52ee5427994d5851b0f85a2c15eedf)
Crash dump is completed