一、前言
在NDK开发中经常会出现应用Crash的情况,而JNI层的报错信息,不像Java层报错信息那样可以直接在日志中看到错误的行数,JNI层中出现的错误直接看根本定位不到错误的位置。通常来说,JNI报的基本都是堆栈信息,需要NDK的一些工具进行地址转换,转换后即可看到错误的位置。这些地址转换的工具有addr2line、ndk-stack等,我比较喜欢addr2line,平时也用这个工具进行调试。
二、分析
错误信息如下:
A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
A/DEBUG: Build fingerprint: 'xiaomi/mido/mido:7.0/NRD90M/V10.1.1.0.NCFCNFI:user/release-keys'
A/DEBUG: Revision: '0'
A/DEBUG: ABI: 'arm'
A/DEBUG: pid: 29290, tid: 29290, name: e.hasee.ndkdemo >>> com.example.hasee.ndkdemo <<<
A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
A/DEBUG: r0 00000000 r1 0000726a r2 00000006 r3 00000008
A/DEBUG: r4 f6cbc590 r5 00000006 r6 f6cbc538 r7 0000010c
A/DEBUG: r8 12e45dc0 r9 f3f88000 sl ff90e8ec fp f3f88000
A/DEBUG: ip 00000058 sp ff90e5f8 lr f5c3a2c7 pc f5c3cb48 cpsr 200f0010
A/DEBUG: backtrace://堆栈信息,只需要关注这部分就好
A/DEBUG: #00 pc 00049b48 /system/lib/libc.so (tgkill+12)
A/DEBUG: #01 pc 000472c3 /system/lib/libc.so (pthread_kill+34)
A/DEBUG: #02 pc 0001d565 /system/lib/libc.so (raise+10)
A/DEBUG: #03 pc 000190b1 /system/lib/libc.so (__libc_android_abort+34)
A/DEBUG: #04 pc 00017114 /system/lib/libc.so (abort+4)
A/DEBUG: #05 pc 0009063f /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so