Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 3661 (ervice.Executor)

前言:当我们在android中的使用JNI下编译的.so库时,很有可能底层编译好的native method出现异常,而且底层并没有对这个异常进行捕捉,这样在我们APK上就是表现为退出程序,查看打印信息,出现的提示是:A/libc(2730): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 3661 (ervice.Executor)。这个是由android linux 内核libc函数抛出的一个打印,从上面我们只能知道内存操作问题。可是具体什么原因,我们确无从下手。我们在eclipse中的All message 中可以查看在fatal 11下面还有如下打印信息:

 技术分享

每个pc后面,我们都含有一个地址,这个地址其实就对应着我们的JNI下面的方法,由此,只要我们将地址发编译回去,就可以获得报错的原因的地方。下面,我将使用一种工具arm-eabi-addr2line来反编译上述地址。

方法:首先我们要将arm-eabi-addr的环境搭建好。我用的是vi .bashrc

在其中插入(按下insert or i 

export PATH=$PATH:/home/lyn/hsp/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin

导入之后,按下Esc键 输入:wq保存退出。记住还要source ~/.bashrc。然后,在输入下arm-linux-androideabi-addr2line,结果若下图打印,则环境搭好啦!

 技术分享

反编译:好啦,终于到了最令人兴奋的时刻,我们在命令行敲下如下代码:

 技术分享

下面是我们要注意的点:

1.我们要将你的libxxxxx.so库复制到你的bin文件下,注意不是libs下的libxxx.so库,这样子你会得到??:0的结果。而是把JNI/obj/local/armeabi/libxxxx.so库复制到你的bin文件下。

2.用哪一个libxxxx.so库是根据最上面/system/lib/libpjsipjni.so来决定的。

3.如果你还出现??:0的情况,那么你可能用的是release版本,那就改为debug版本把!jni/目录下增加Application.mk 文件, 修改为debug 模式,进行调试 APP_OPTIM := debug具体application.mk 文件的配置见: 

http://blog.csdn.net/weidawei0609/article/details/6561280

 

 

参考网址:

http://blog.csdn.net/hun_sunny/article/details/8350151


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。