在进行NDK相关开发时会经常遇到各种闪退异常,Native层的异常不像Java层的异常一样能直接把详细的堆栈信息输出到logcat,那我们该如何处理Native层异常问题呢?
Native层的异常排查相对比较麻烦点
第一种方法
直接点击debug运行,使用LLDB,不要打断点,会自动定位到错误行(Android5.0不行,需要Android6+)
第二种方法(错误日志分析)
在logcat界面定位到异常输出
1
| Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 20769 (Thread-775)
|
然后去data/tombstones,目录下找最近报错的日志文件导出(可能需要ROOT权限)
1 2 3
| pull /data/tombstones/tombstone_03 /data/tombstones/tombstone_03: 1 file pulled, 0 skipped. 3.5 MB/s (334204 bytes in 0.092s)
|
分下日志文件
1 2 3 4 5 6 7 8 9 10 11 12
| Build fingerprint: 'Honor/SCL-AL00/hnSCL-Q:5.1.1/HonorSCL- AL00/C00B261:user/release-keys' Revision: '0' ABI: 'arm' pid: 20655, tid: 20769, name: Thread-775 >>> com.xxx.player <<< signal 11 (SIGSEGV), code 0 (SI_USER), fault addr 0x0 【终点是下面的】 backtrace: #00 pc 002e0590 /data/app/com.xxx.player-1/lib/arm/libnative-lib.so (Java_com_xxx_player_XXXPlayer_startNative+43) #01 pc 0012e57f /data/dalvik-cache/arm/data@app@com.xxx.player- 1@base.apk@classes.dex
|
继续往下分析,具体行 报错的:
需要配置adb和ndk的环境变量
1
| adb logcat | ndk-stack -sym 你项目的路径/xxxx/xxx/armeabi-v7a
|
执行命令后,一直等待,需要运行一次(奔溃一次) 他才能输出结果
1 2 3 4 5 6 7 8 9 10
| C:\Users\Taurus>adb logcat | ndk-stack -sym 你的项目/app/build/intermediates/cmake/debug/obj/armeabi-v7a ********** Crash dump: ********** Build fingerprint: 'Honor/SCL-AL00/hnSCL-Q:5.1.1/HonorSCL- AL00/C00B261:user/release-keys' #00 0x002e0590 /data/app/com.xxx.player-2/lib/arm/libnative-lib.so (Java_com_xxx_player_XXXPlayer_startNative+43) Java_com_xxx_player_XXXPlayer_startNative 你的项目/app/src/main/cpp\native-lib.cpp:111:14 Crash dump is completed
|