天天看點

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下面還有如下列印資訊:

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

每個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,結果若下圖列印,則環境搭好啦!

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

反編譯:好啦,終于到了最令人興奮的時刻,我們在指令行敲下如下代碼:

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

下面是我們要注意的點:

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

繼續閱讀