解决方法是使用ndk-stack工具解析堆栈跟踪信息,以便找到问题并进行调试。
使用ndk-stack工具,可以将生成的*.txt文件中的错误行与原始代码行号相关联。以下是代码示例:
1.在build.gradle中为ndk构建工具添加路径:
android { ... defaultConfig { ... ndk { // 设置NDK路径 moduleName "mylib" abis "armeabi-v7a", "arm64-v8a", "x86", "x86_64" // 设置不同abi的库的路径 ldLibs "log", "z" } } ... }
2.在代码中,使用以下代码行保存堆栈跟踪信息:
void Test() { char * ptr = NULL; *ptr = 0; }
3.最后查看logcat结果,会得到以下结果:
F/libc ( 3165): Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdeadbaad in tid 3217 (my.package.name) I/DEBUG ( 116): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** I/DEBUG ( 116): Build fingerprint: 'google_fugu/fugu:7.1.1/NMF26Q/4118817:user/release-keys' I/DEBUG ( 116): Revision: '0' I/DEBUG ( 116): ABI: 'arm64' I/DEBUG ( 116): pid: 3165, tid: 3217, name: JNITest >>> my.package.name <<< I/DEBUG ( 116): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xdeadbaad I/DEBUG ( 116): x0 000000000000a330 x1 0000007fc96f3ae0 x2 0000007fc96fffb8 x3 0000007fc96f3ae0 I/DEBUG ( 116): x4 0000007fca19a769 x5 0000007fca19a1a0 x6 0000007fc96fffb8 x7 00000000000000ff I/DEBUG ( 116): x8 0000000000000400 x9 0000007fc96fffb0 x10 0000000000000000 x11 0000000000000400 I/DEBUG ( 116): x12 0000007fc96fffb8 x13 0000007fca19b200 x14 00000000000001c8 x15 0000000000000200 I/DEBUG ( 116): x16 0000007fca19d880 x17 0000007fca1b0b80 x18 0000000000000000 x19 0000000000000770 I/DEBUG ( 116): x20 0000007fc96f3ae0 x21 0000007fc96fffb8 x22 0000007fc96f3ae0 x23 0000007fc96fffb8 I