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

 

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值