NDK中signal 11(SIGSEGV)问题的解决方法

  1. 上面的crash问题都是在jni层c++代码中出现的,根据log的提示

F/libc    ( 5580): Fatal signal 11 (SIGSEGV) at 0x0004811a (code=1), thread 5593 (Cursor server e)

Fatal signal 11 (SIGSEGV):这个signal 11 明确指示该问题是由空指针引起的。出现这个signal 11 的log我们就可以确定其是由空指针引起,我们不要往其它方面想,从空指针的方向去找就可以了。

 

  1. 至于具体是在什么地方有空指针,可以根据backtrace来判断,log中记录的backtrace如下:

I/DEBUG   (  136): backtrace:

 

I/DEBUG   (  136):     #00  pc 0000916c  /data/app-lib/com.orbbec.handgestureregdemo-2/libinteraction.so (jni_getDepthFromColor(_JNIEnv*, _jobject*, int, int, _jobject*)+256)

 

I/DEBUG   (  136):     #01  pc 0001dbcc  /system/lib/libdvm.so (dvmPlatformInvoke+112)

 

I/DEBUG   (  136):     #02  pc 0004e133  /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)

 

I/DEBUG   (  136):     #03  pc 00000214  /dev/ashmem/dalvik-jit-code-cache (deleted)

 

根据以上的log可以明确看出来,引用空指针的地方在jni_getDepthFromColor。

 

  1. 解决方法:找到出现空指针访问的函数之后,在空指针访问之前对指针进行保护,保护之后,如果不影响业务,就算解决完成了。

 

  1. 如果空指针所在函数比较大,可以进一步分析,从而定位出空指针访问出现在那一行代码。这个时候就需要两个工具来完成分析,一个是arm-linux-androideabi-addr2line.exe,另外一个是aarch64-linux-android-objdump.exe。工具一般在NDK的D:\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin目录下。

 

要使用addr2line的工具,必须要编译Debug版本的app,并且需要引用带符号表的so库,编译方法可以参考:https://blog.csdn.net/a87b01c14/article/details/41480931。

 

Addr2line的使用方法可以参考:https://blog.csdn.net/toyauko/article/details/82416429。

 

 

 

 

 

 

 

你可能感兴趣的:(Android)