NDK开发之Native异常处理

在进行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