signal 11 (SIGSEGV)錯(cuò)誤排查

jni調(diào)試最蛋疼的就是signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4這種錯(cuò)誤百姓,爆出來完全不知道是哪句代碼造成的,很難定位到問題所在耀盗,網(wǎng)上很多人說是內(nèi)存原因荸实,還有說是空指針蔽莱,不一而論内颗。
我的錯(cuò)誤是這樣的:

02-16 14:54:53.041 20897-20897/? I/AEE/AED: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4
02-16 14:54:53.058 20897-20897/? I/AEE/AED:     r0 00000001  r1 00000002  r2 00000000  r3 0000002f
02-16 14:54:53.058 20897-20897/? I/AEE/AED:     r4 00000000  r5 f4489000  r6 f4400000  r7 f6fb3c0c
02-16 14:54:53.058 20897-20897/? I/AEE/AED:     r8 f48000c0  r9 f6fb3c0c  sl 00000001  fp 00000002
02-16 14:54:53.058 20897-20897/? I/AEE/AED:     ip f6fb3c24  sp dc144060  lr 00000000  pc f6f7f566  cpsr 600f0030
02-16 14:54:53.059 20897-20897/? I/AEE/AED: backtrace:
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #00 pc 00042566  /system/lib/libc.so (je_arena_dalloc_bin_locked+365)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #01 pc 0004fa0b  /system/lib/libc.so (je_tcache_bin_flush_small+234)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #02 pc 0004a33f  /system/lib/libc.so (ifree+446)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #03 pc 00035775  /data/app/我的包名-1/lib/arm/libjni-lib.so (std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >::~basic_string()+148)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #04 pc 00086087  /data/app/我的包名-1/lib/arm/libjni-lib.so (WPZHandler::OnRspQryPosition(TradingLibFast::RspQryPositionResponse*)+2518)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #05 pc 0004451d  /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::TLClient::HandleMessage(TradingLibFast::Message&)+964)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #06 pc 00041083  /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::TLClient::RecvFun()+226)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #07 pc 00066cfb  /data/app/我的包名-1/lib/arm/libjni-lib.so (fastdelegate::FastDelegate0<bool>::operator()() const+94)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #08 pc 00066889  /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::TLThread::ProcessInThread()+68)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #09 pc 00066837  /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::ThreadFunc(void*)+26)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #10 pc 00017003  /system/lib/libc.so (__pthread_start(void*)+30)
02-16 14:54:53.059 20897-20897/? I/AEE/AED:     #11 pc 0001506f  /system/lib/libc.so (__start_thread+6)

然后就是nativeCrashListener沛鸵,這個(gè)log其實(shí)已經(jīng)很清晰了蛾娶,記得一定不要過濾灯谣,選擇no Filters,日志級別選擇Verbose最低級別蛔琅,這樣才能看到最全的log信息胎许。je_arena_dalloc_bin_locked顯示就是內(nèi)存處理出問題了,jni代碼出問題導(dǎo)致了系統(tǒng)錯(cuò)誤罗售。再往下包含“我的包名”的log信息就顯示了錯(cuò)誤的具體位置辜窑,越上面就是越具體的位置,越下面范圍就越廣寨躁,這里大致就定位了問題代碼大概在哪幾行穆碎。不過這幾行我糾結(jié)了許久,因?yàn)橛X得沒有問題职恳,閃退只是偶現(xiàn)所禀,后來看到另外一篇文章:常見 core dump 原因分析signal 11 - SIGSEGV,說signal 11 (SIGSEGV)是由于內(nèi)存釋放不當(dāng)(多次釋放或者空釋放)或者空指針引起的,遂檢查放钦,終于發(fā)現(xiàn)了問題:
在調(diào)用NewStringUTF方法的時(shí)候使用了ReleaseStringUTFChars進(jìn)行釋放色徘,這個(gè)釋放內(nèi)存的方法并不能在此處使用,應(yīng)該使用DeleteLocalRef來釋放引用即可操禀。
jni具體內(nèi)存釋放對應(yīng)方法如下:
總體原則:釋放所有對object的引用

1.FindClass
例如褂策,

jclass ref= (env)->FindClass("java/lang/String"); 
env->DeleteLocalRef(ref); 

2.NewString/ NewStringUTF/NewObject/NewByteArray
例如,

jstring     (*NewString)(JNIEnv*, const jchar*, jsize);    
const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);     void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*); 
jstring     (*NewStringUTF)(JNIEnv*, const char*);    
const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);     void        (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*); 
env->DeleteLocalRef(ref); 

3.GetObjectField/GetObjectClass/GetObjectArrayElement

jclass ref = env->GetObjectClass(robj); 
env->DeleteLocalRef(ref);  

4.GetByteArrayElements和GetStringUTFChars

jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy); 
(*env)->ReleaseByteArrayElements(env,jarray,array,0); 
const char* input =(*env)->GetStringUTFChars(env,jinput, &isCopy); 
(*env)->ReleaseStringUTFChars(env,jinput,input); 

5.NewGlobalRef/DeleteGlobalRef
jobject (NewGlobalRef)(JNIEnv, jobject);
void (DeleteGlobalRef)(JNIEnv, jobject);
例如颓屑,

jobject ref= env->NewGlobalRef(customObj); 
env->DeleteGlobalRef(customObj); 

改完果然就沒有再閃退了辙培!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市邢锯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搀别,老刑警劉巖丹擎,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡蒂培,警方通過查閱死者的電腦和手機(jī)再愈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來护戳,“玉大人翎冲,你說我怎么就攤上這事∠被模” “怎么了抗悍?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钳枕。 經(jīng)常有香客問我缴渊,道長,這世上最難降的妖魔是什么鱼炒? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任衔沼,我火速辦了婚禮,結(jié)果婚禮上昔瞧,老公的妹妹穿的比我還像新娘指蚁。我一直安慰自己,他們只是感情好自晰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布凝化。 她就那樣靜靜地躺著,像睡著了一般缀磕。 火紅的嫁衣襯著肌膚如雪缘圈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天袜蚕,我揣著相機(jī)與錄音糟把,去河邊找鬼。 笑死牲剃,一個(gè)胖子當(dāng)著我的面吹牛遣疯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凿傅,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缠犀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了聪舒?” 一聲冷哼從身側(cè)響起辨液,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箱残,沒想到半個(gè)月后滔迈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體止吁,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年燎悍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敬惦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谈山,死狀恐怖俄删,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奏路,我是刑警寧澤畴椰,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站思劳,受9級特大地震影響迅矛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜潜叛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一秽褒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧威兜,春花似錦销斟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笔宿,卻和暖如春犁钟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泼橘。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工涝动, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炬灭。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓醋粟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親重归。 傳聞我的和親對象是個(gè)殘疾皇子米愿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 什么是JNI? JNI 是java本地開發(fā)接口.JNI 是一個(gè)協(xié)議,這個(gè)協(xié)議用來溝通java代碼和外部的本地代碼(...
    a_tomcat閱讀 2,822評論 0 54
  • JNI編程 JNI是一種本地編程接口鼻吮。它允許運(yùn)行在JAVA虛擬機(jī)中的JAVA代碼和用其他編程語言育苟,諸如C語言、C+...
    微塵_8957閱讀 456評論 0 0
  • 0.要素1.類操作2.異常操作3.全局及局部引用4.對象操作5.字符串操作6.數(shù)組操作7.訪問對象的屬性和方法7....
    MagicalGuy閱讀 1,339評論 0 2
  • 原鏈接:http://www.ibm.com/developerworks/cn/java/j-jni/ 使用 J...
    王朋6閱讀 7,747評論 0 8
  • 前言 JNI 的全稱是:Java Native Interface笨腥,即連接 Java 虛擬機(jī)和本地代碼的接口,它允...
    全站工程師閱讀 3,849評論 0 5