【從0開發(fā)搭建App】Crash]iOS Crash文件的解析

【轉(zhuǎn)】http://www.cocoachina.com/ios/20150505/11731.html

開發(fā)程序的過(guò)程中不管我們已經(jīng)如何小心,總是會(huì)在不經(jīng)意間遇到程序閃退锰蓬。腦補(bǔ)一下當(dāng)你在一群人面前自信的拿著你的App做功能預(yù)演的時(shí)候,流暢的操作被無(wú)情地Crash打斷迎罗。聯(lián)想起老羅在發(fā)布Smartisan OS的時(shí)候說(shuō)了捧灰,他準(zhǔn)備了10個(gè)手機(jī),如果一臺(tái)有問(wèn)題蚂且,就換一臺(tái)配猫,如果10臺(tái)后掛了他就不做手機(jī)了。好了不閑扯了杏死,今天就跟大家一起聊聊iOSCrash文件的組成以及常用的分析工具泵肄。

有一個(gè)WWDC 2010的視頻推薦大家抽空看看,視頻名稱“Understanding Crash Reports on iPhone OS”淑翼,該視頻詳細(xì)講解了Crash文件的結(jié)構(gòu)腐巢。當(dāng)然如果你沒(méi)時(shí)間看的話,不妨閱讀以下這篇文章玄括。

一冯丙、Crash文件結(jié)構(gòu)

當(dāng)程序運(yùn)行Crash的時(shí)候,系統(tǒng)會(huì)把運(yùn)行的最后時(shí)刻的運(yùn)行信息記錄下來(lái)惠豺,存儲(chǔ)到一個(gè)文件中银还,也就是我們所說(shuō)的Crash文件。iOS的Crash日志通常由以下6各部分組成洁墙。

1蛹疯、Process Information(進(jìn)程信息)

1430731040132301.png

2、Basic Information

1430731148869008.png

3热监、Exception(非常重要)

blob.png

4捺弦、Thread Backtrace

發(fā)生Crash的線程的Crash調(diào)用棧,從上到下分別代表調(diào)用順序,最上面的一個(gè)表示拋出異常的位置列吼,依次往下可以看到API的調(diào)用順序幽崩。上圖的信息表明本次Crash出現(xiàn)xxxViewController的323行,出錯(cuò)的函數(shù)調(diào)用為orderCountLoadFailed寞钥。

5慌申、Thread State

Crash時(shí)發(fā)生時(shí)刻,線程的狀態(tài)理郑,通常我們根據(jù)Crash棧即可獲取到相關(guān)信息蹄溉,這部分一般不用關(guān)心。

6您炉、Binary Images

Crash時(shí)刻App加載的所有的庫(kù)柒爵,其中第一行是Crash發(fā)生時(shí)我們App可執(zhí)行文件的信息,可以看出為armv7赚爵,可執(zhí)行文件的包得uuid位c0f……cd65棉胀,解析Crash的時(shí)候dsym文件的uuid必須和這個(gè)一樣才能完成Crash的符號(hào)化解析。

二冀膝、常見的Crash類型

1唁奢、Watchdog timeout

Exception Code:0x8badf00d, 不太直觀窝剖,可以讀成“eat bad food”驮瞧,意思是don‘t block main thread

緊接著下面會(huì)有一段描述:

Application Specific Information:

com.xxx.yyy   failed to resume in time

對(duì)于此類Crash,我們應(yīng)該去審視自己App初始化時(shí)做的事情是否正確枯芬,是否在主線程請(qǐng)求了網(wǎng)絡(luò),或者其他耗時(shí)的事情卡住了正常初始化流程采郎。

通常系統(tǒng)允許一個(gè)App從啟動(dòng)到可以相應(yīng)用戶事件的時(shí)間最多為5S千所,如果超過(guò)了5S,App就會(huì)被系統(tǒng)終止掉蒜埋。在Launch淫痰,resume,suspend整份,quit時(shí)都會(huì)有相應(yīng)的時(shí)間要求待错。在Highlight Thread里面我們可以看到被終止時(shí)調(diào)用到的位置,xxxAppDelegate加上行號(hào)烈评。

PS. 在連接X(jué)code調(diào)試時(shí)為了便于調(diào)試火俄,系統(tǒng)會(huì)暫時(shí)禁用掉Watchdog,所以此類問(wèn)題的發(fā)現(xiàn)需要使用正常的啟動(dòng)模式讲冠。

2瓜客、User force-quit

Exception Codes: 0xdeadfa11, deadfall

這個(gè)強(qiáng)制退出跟我們平時(shí)所說(shuō)的kill掉后臺(tái)任務(wù)操作還不太一樣,通常在程序bug造成系統(tǒng)無(wú)法響應(yīng)時(shí)可以采用長(zhǎng)按電源鍵,當(dāng)屏幕出現(xiàn)關(guān)機(jī)確認(rèn)畫面時(shí)按下Home鍵即可關(guān)閉當(dāng)前程序谱仪。

3玻熙、Low Memory termination

跟一般的Crash結(jié)構(gòu)不太一樣,通常有Free pages疯攒,Wired Pages嗦随,Purgeable pages,largest process 組成敬尺,同事會(huì)列出當(dāng)前時(shí)刻系統(tǒng)運(yùn)行所有進(jìn)程的信息枚尼。

關(guān)于Memory warning可以參看我之前寫的一篇文章iOS 內(nèi)存警告 Memory warning level。

App在運(yùn)行過(guò)程中筷转,系統(tǒng)內(nèi)存緊張時(shí)通常會(huì)先發(fā)警告姑原,同時(shí)把后臺(tái)掛起的程序終止掉,最終如果還是內(nèi)存不夠的話就會(huì)終止掉當(dāng)前前臺(tái)的進(jìn)程呜舒。

當(dāng)接受到內(nèi)存警告的事后锭汛,我們應(yīng)該釋放盡可能多的內(nèi)存,Crash其實(shí)也可以看做是對(duì)App的一種保護(hù)袭蝗。

4唤殴、Crash due to bugs

因?yàn)槌绦騜ug導(dǎo)致的Crash通常千奇百怪,很難一概而論到腥。大部分情況通過(guò)Crash日志就可以定位出問(wèn)題朵逝,當(dāng)然也不排除部分疑難雜癥看半天都不值問(wèn)題出在哪兒。這個(gè)就只能看功底了乡范,一點(diǎn)點(diǎn)找配名,總是能發(fā)現(xiàn)蛛絲馬跡。是在看不出來(lái)時(shí)還可以求助于Google大神晋辆,總有人遇到和你一樣的Bug

三渠脉、常見的Exception Type & Exception Code

1、Exception Type

1)EXC_BAD_ACCESS

此類型的Excpetion是我們最長(zhǎng)碰到的Crash瓶佳,通常用于訪問(wèn)了不改訪問(wèn)的內(nèi)存導(dǎo)致芋膘。一般EXC_BAD_ACCESS后面的"()"還會(huì)帶有補(bǔ)充信息。

SIGSEGV: 通常由于重復(fù)釋放對(duì)象導(dǎo)致霸饲,這種類型在切換了ARC以后應(yīng)該已經(jīng)很少見到了为朋。

SIGABRT:? 收到Abort信號(hào)退出,通常Foundation庫(kù)中的容器為了保護(hù)狀態(tài)正常會(huì)做一些檢測(cè)厚脉,例如插入nil到數(shù)組中等會(huì)遇到此類錯(cuò)誤习寸。

SEGV:(Segmentation? Violation),代表無(wú)效內(nèi)存地址傻工,比如空指針融涣,未初始化指針童番,棧溢出等;

SIGBUS:總線錯(cuò)誤威鹿,與 SIGSEGV 不同的是剃斧,SIGSEGV 訪問(wèn)的是無(wú)效地址,而 SIGBUS 訪問(wèn)的是有效地址忽你,但總線訪問(wèn)異常(如地址對(duì)齊問(wèn)題)

SIGILL:嘗試執(zhí)行非法的指令幼东,可能不被識(shí)別或者沒(méi)有權(quán)限

2)EXC_BAD_INSTRUCTION

此類異常通常由于線程執(zhí)行非法指令導(dǎo)致

3)EXC_ARITHMETIC

除零錯(cuò)誤會(huì)拋出此類異常

2、Exception Code

0xbaaaaaad此種類型的log意味著該Crash log并非一個(gè)真正的Crash科雳,它僅僅只是包含了整個(gè)系統(tǒng)某一時(shí)刻的運(yùn)行狀態(tài)根蟹。通常可以通過(guò)同時(shí)按Home鍵和音量鍵糟秘,可能由于用戶不小心觸發(fā)

0xbad22222當(dāng)VOIP程序在后臺(tái)太過(guò)頻繁的激活時(shí)简逮,系統(tǒng)可能會(huì)終止此類程序

0x8badf00d這個(gè)前面已經(jīng)介紹了,程序啟動(dòng)或者恢復(fù)時(shí)間過(guò)長(zhǎng)被watch dog終止

0xc00010ff程序執(zhí)行大量耗費(fèi)CPU和GPU的運(yùn)算尿赚,導(dǎo)致設(shè)備過(guò)熱散庶,觸發(fā)系統(tǒng)過(guò)熱保護(hù)被系統(tǒng)終止

0xdead10cc程序退到后臺(tái)時(shí)還占用系統(tǒng)資源,如通訊錄被系統(tǒng)終止

0xdeadfa11前面也提到過(guò)凌净,程序無(wú)響應(yīng)用戶強(qiáng)制關(guān)閉

三悲龟、獲取Crash的途徑

1、本機(jī)

通過(guò)xCode連接測(cè)試機(jī)器冰寻,直接在Device中即可讀取到該機(jī)器上發(fā)生的所有Crash log须教。

2、itunes connect

通過(guò)itunes connect后臺(tái)獲取到用戶上報(bào)的Crash日志斩芭。

3轻腺、第三方的Crash收集系統(tǒng)

有很多優(yōu)秀的第三方Crash收集系統(tǒng)大大的方便了我們收集Crash,甚至還帶了符號(hào)化Crash日志的功能划乖。比較常用的有Crashlytics约计,F(xiàn)lurry等。

四迁筛、附錄

Apple官方文檔:

Understanding and Analyzing iOS Application Crash Reports

Technical Note TN2123 CrashReporter

https://developer.apple.com/library/ios/qa/qa1592/_index.html

WWDC視頻:

Understanding Crash Reports on iPhone OS

Crash日志記錄的時(shí)候是將Crash發(fā)生時(shí)刻,函數(shù)的調(diào)用棧耕挨,以及線程等信息寫入文件细卧。一般都是直接寫的16進(jìn)制地址,如果不經(jīng)過(guò)符號(hào)化的話筒占,基本上很難獲取到有用信息贪庙,下一篇我們將聊一聊Crash日志的符號(hào)化,通俗點(diǎn)講就是讓Crash日志變成我們可讀的格式翰苫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末止邮,一起剝皮案震驚了整個(gè)濱河市这橙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌导披,老刑警劉巖屈扎,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撩匕,居然都是意外死亡鹰晨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門止毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)模蜡,“玉大人,你說(shuō)我怎么就攤上這事扁凛∪碳玻” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵谨朝,是天一觀的道長(zhǎng)卤妒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)叠必,這世上最難降的妖魔是什么荚孵? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮纬朝,結(jié)果婚禮上收叶,老公的妹妹穿的比我還像新娘。我一直安慰自己共苛,他們只是感情好判没,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隅茎,像睡著了一般澄峰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辟犀,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天俏竞,我揣著相機(jī)與錄音,去河邊找鬼堂竟。 笑死魂毁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的出嘹。 我是一名探鬼主播席楚,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼税稼!你這毒婦竟也來(lái)了烦秩?” 一聲冷哼從身側(cè)響起垮斯,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只祠,沒(méi)想到半個(gè)月后兜蠕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铆农,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年牺氨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩剖。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猴凹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岭皂,到底是詐尸還是另有隱情郊霎,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布爷绘,位于F島的核電站书劝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏土至。R本人自食惡果不足惜购对,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陶因。 院中可真熱鬧骡苞,春花似錦、人聲如沸楷扬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烘苹。三九已至躲株,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镣衡,已是汗流浹背霜定。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廊鸥,地道東北人望浩。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黍图,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奴烙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • 前言 iOS崩潰是讓iOS開發(fā)人員比較頭痛的事情助被,app崩潰了剖张,說(shuō)明代碼寫的有問(wèn)題,這時(shí)如何快速定位到崩潰的地方很...
    齊滇大圣閱讀 65,243評(píng)論 29 443
  • 一揩环、Crash文件結(jié)構(gòu) 當(dāng)程序運(yùn)行Crash的時(shí)候搔弄,系統(tǒng)會(huì)把運(yùn)行的最后時(shí)刻的運(yùn)行信息記錄下來(lái),存儲(chǔ)到一個(gè)文件中丰滑,也...
    周末年安閱讀 1,139評(píng)論 0 49
  • 轉(zhuǎn)載自http://www.cnblogs.com/smileEvday/p/Crash1.html **開發(fā)程序...
    西木閱讀 2,128評(píng)論 0 6
  • 一顾犹、Crash文件結(jié)構(gòu) 當(dāng)程序運(yùn)行Crash的時(shí)候,系統(tǒng)會(huì)把運(yùn)行的最后時(shí)刻的運(yùn)行信息記錄下來(lái)褒墨,存儲(chǔ)到一個(gè)文件中炫刷,也...
    yizhaorong閱讀 1,273評(píng)論 0 51
  • 大家好浑玛,我是創(chuàng)業(yè)學(xué)院王春雨,QQ\微信:304995079 選擇項(xiàng)目很重要噩咪,大家一定養(yǎng)成動(dòng)腦的習(xí)慣顾彰,認(rèn)定了一個(gè)剛需...
    做一個(gè)正能量的人閱讀 195評(píng)論 0 0