Android之內存越界導致的ANR問題的定位過程

最近在做項目的過程中發(fā)現(xiàn)一個比較詭異的現(xiàn)象:生產環(huán)境中谤祖,在Android 4.x系統(tǒng)上Release版本上比較頻繁的的出現(xiàn)ANR, 而Debug版本沒有出現(xiàn)些楣;同時掂碱,在Android 6.x系統(tǒng)上也有個別手機會出現(xiàn)此問題躏敢。根據(jù)問題發(fā)生的場景商佛,進行了反復的測試喉钢,發(fā)現(xiàn)ANR的現(xiàn)象基本發(fā)生在固定兩個頁面。

采取了兩個思路:
1良姆、查看log與trace文件肠虽,Review兩個頁面的代碼,看是否有出現(xiàn)耗時的操作
2玛追、簡化代碼税课,去除其他模塊的影響

措施1: Review代碼及查看log與trace文件
-- 查看簡化相關模塊的代碼,沒有發(fā)現(xiàn)特別耗時的操作
-- 在出現(xiàn)ANR的地方查看日志痊剖,沒有發(fā)現(xiàn)有價值的信息
-- 獲取到trace文件韩玩,查看文件中是否存在死鎖、消息廣播阻塞及線程的互相
等待陆馁,搜索關鍵字找颓,查看對應的tid與pid,沒有發(fā)現(xiàn)異常叮贩。

花了2-3天時間的叮雳,特別是對log文件的觀察與學習trace文件的理解想暗,還是挺花時間的,措施1基本沒有什么發(fā)現(xiàn)帘不。

措施2: 重寫與簡化代碼
-- 由于項目模塊較多说莫,并且模塊間有一定的耦合性,簡單的簡化代碼可能達不到預想的效果寞焙,因為采取重新創(chuàng)建工程的方式储狭,移植并簡化代碼,保證出現(xiàn)問題的固定兩個頁面可用即可捣郊。

  -- 移植完畢后辽狈,反復測試,發(fā)現(xiàn)問題仍然存在呛牲。

  -- 繼續(xù)簡化代碼刮萌,去掉應用中的一個自定義組件,加密鍵盤娘扩,發(fā)現(xiàn)問題消失

  -- 懷疑是否與鍵盤Java層代碼的內存泄漏有關着茸,查看管理部分的代碼,并且結合集成LeakCandary內存泄漏檢測工具琐旁,確實存在單例模式使用不當造成的內存泄漏涮阔,解決內存泄漏問題,問題仍然存在灰殴,因此判定不是Java層內存泄漏引起的敬特。

  -- 既然與Java層內存泄漏沒有關系,懷疑的重點就放在了底層JNI的加解密上牺陶,由于底層涉及到3次對密碼進行加解密伟阔,猜測是否與加解密函數(shù)有關系,注釋調加解密加解密部分代碼掰伸,發(fā)現(xiàn)問題消失减俏,因此確定問題可能與加解密部分代碼有關系

  -- 通過多次注釋與測試,問題代碼縮小到登錄密碼加密部分的代碼碱工,經過不斷的修改測試及代碼Review娃承,發(fā)現(xiàn)了一個嚴重的內存越界問題:malloc動態(tài)分配的內存大小為srcLen,但是在后續(xù)的使用過程有一個函數(shù)是將Hex字節(jié)數(shù)組轉化為字符串怕篷,在最后一個字符串賦值時历筝,char* 的數(shù)組下標引用為srcLen, 并賦值為\0結束符。

明顯此處訪問內存是出現(xiàn)了越界廊谓,總共分配了srcLen大小的內存梳猪,而在使用時卻訪問到了strLen +1長度的內存,而這個后果是不可預知的,修正后再測試春弥,問題消失呛哟。

這個過程費時費力,前后花了差不多一周時間匿沛,還好總算是在正確的方向上扫责。問題解決后,仍然帶有一些疑問:

1逃呼、為什么問題在Debug版本反復測試沒有出現(xiàn)鳖孤,是不是因為在Release模式下內存的分配與檢查更加的嚴格,而Debug模式下抡笼,內存的管理與Release不一樣苏揣,可能分配的內存更加的充足?這樣即使內存越界了推姻,如果越界的內存是空閑內存平匈,仍然不會觸發(fā)整個應用的ANR, 為了進一步找原因,仔細查看了內存泄漏藏古、內存越界增炭、內存溢出的易發(fā)場景及C程序在運行是的內存分配,最后也沒有找到原因校翔。

2弟跑、為什么在Android 4.x的系統(tǒng)上頻繁復現(xiàn)灾前,而高版本的系統(tǒng)上出現(xiàn)概率不高防症?這個問題的也許可以這樣解釋:1、內存越界的問題本身就非常隱蔽哎甲,并且造成的后果頁不可知蔫敲,如果搞好越界的內存是空閑內存,問題可能就不會理解發(fā)生直到越界的內存被另外的程序分配了內存才會真正觸發(fā)問題的產生 2炭玫、高版本的使用ART運行時編譯器及Android底層內存管理更加優(yōu)化

3奈嘿、為什么內存越界會導致應用程序的ANR? 可能是因為內存越界導致的后果具有不確定性,當問題越界時引用其他代碼分配的內存快吞加,兩段程序對內存資源的競爭導致應用程序的超時出現(xiàn)了ANR裙犹,這也只是猜測。

帶著這些疑問衔憨,又把C程序中關于內存管理的基礎知識復寫了一遍叶圃,具體見鏈接:
1、C語言內存管理一本道來 http://www.reibang.com/p/502a1919e189
2践图、42_內存操作經典問題分析二 http://www.reibang.com/p/d998176f80f0

總結:
當遇到類似ANR的問題時掺冠,可以考慮使用以下的這些方法輔助定位:
1、根據(jù)業(yè)務場景查看log及trace文件
如何查看log
如何查看trace文件:是否有死鎖码党、是否有明顯的應用程序類
2德崭、推翻重寫或簡化代碼
3斥黑、集成第三方工具LeakCandary

當真的是沒有什么頭緒時,要跳出ANR的局限思維眉厨,猜測有沒有可能是內存問題了锌奴。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缺猛,隨后出現(xiàn)的幾起案子缨叫,更是在濱河造成了極大的恐慌,老刑警劉巖荔燎,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耻姥,死亡現(xiàn)場離奇詭異,居然都是意外死亡有咨,警方通過查閱死者的電腦和手機琐簇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門蒿秦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沃于,“玉大人,你說我怎么就攤上這事项钮≡眩” “怎么了丈秩?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淳衙。 經常有香客問我蘑秽,道長,這世上最難降的妖魔是什么箫攀? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任肠牲,我火速辦了婚禮,結果婚禮上靴跛,老公的妹妹穿的比我還像新娘缀雳。我一直安慰自己,他們只是感情好梢睛,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布肥印。 她就那樣靜靜地躺著,像睡著了一般绝葡。 火紅的嫁衣襯著肌膚如雪深碱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天挤牛,我揣著相機與錄音莹痢,去河邊找鬼。 笑死,一個胖子當著我的面吹牛竞膳,可吹牛的內容都是我干的航瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼坦辟,長吁一口氣:“原來是場噩夢啊……” “哼刊侯!你這毒婦竟也來了?” 一聲冷哼從身側響起锉走,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤滨彻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挪蹭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亭饵,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年梁厉,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜羊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡词顾,死狀恐怖八秃,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情肉盹,我是刑警寧澤昔驱,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站上忍,受9級特大地震影響骤肛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜睡雇,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一萌衬、第九天 我趴在偏房一處隱蔽的房頂上張望饮醇。 院中可真熱鬧它抱,春花似錦、人聲如沸朴艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祠墅。三九已至侮穿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毁嗦,已是汗流浹背亲茅。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克锣。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓茵肃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袭祟。 傳聞我的和親對象是個殘疾皇子验残,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345