crash文件解析

轉(zhuǎn)載自http://www.cnblogs.com/smileEvday/p/Crash1.html

**開(kāi)發(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的視頻推薦大家抽空看看垢揩,視頻名稱(chēng)“Understanding Crash Reports on iPhone OS”,該視頻詳細(xì)講解了Crash文件的結(jié)構(gòu)敛瓷。當(dāng)然如果你沒(méi)時(shí)間看的話(huà)叁巨,不妨閱讀以下這篇文章。

一呐籽、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)程信息)


Incident Idnetifier
崩潰報(bào)告的唯一標(biāo)識(shí)符悬包,不同的Crash

CrashReporter Key
設(shè)備標(biāo)識(shí)相對(duì)應(yīng)的唯一鍵值(并非真正的設(shè)備的UDID,蘋(píng)果為了保護(hù)用戶(hù)隱私iOS6以后已經(jīng)無(wú)法獲取)馍乙。通常同一個(gè)設(shè)備上同一版本的App發(fā)生Crash時(shí)布近,該值都是一樣的。

Hardware Model
代表發(fā)生Crash的設(shè)備類(lèi)型丝格,上圖中的“iPad4,4”代表iPad Air

Process
代表Crash的進(jìn)程名稱(chēng)撑瞧,通常都是我們的App的名字, []里面是當(dāng)時(shí)進(jìn)程的ID

Path
可執(zhí)行程序在手機(jī)上的存儲(chǔ)位置,注意路徑時(shí)到XXX.app/XXX显蝌,XXX.app其實(shí)是作為一個(gè)Bundle的预伺,真正的可執(zhí)行文件其實(shí)是Bundle里面的XXX,感興趣的可以自己查一下相關(guān)資料曼尊,有機(jī)會(huì)我后面也會(huì)介紹到

Identifier
你的App的Indentifier酬诀,通常為“com.xxx.yyy”,xxx代表你們公司的域名骆撇,yyy代表某一個(gè)App

Version
當(dāng)前App的版本號(hào)瞒御,由Info.plist中的兩個(gè)字段組成,CFBundleShortVersionString
and CFBundleVersion

Code Type
當(dāng)前App的CPU架構(gòu)

Parent Process
當(dāng)前進(jìn)程的父進(jìn)程神郊,由于iOS中App通常都是單進(jìn)程的肴裙,一般父進(jìn)程都是launchd

2、Basic Information



Date/Time
Crash發(fā)生的時(shí)間涌乳,可讀的字符串

OS Version
系統(tǒng)版本蜻懦,()內(nèi)的數(shù)字代表的時(shí)Bulid號(hào)

Report Version
Crash日志的格式,目前基本上都是104夕晓,不同的version里面包含的字段可能有不同

3宛乃、Exception(非常重要)



Exception Type
異常類(lèi)型

Exception Subtype:
異常子類(lèi)型

Crashed Thread
發(fā)生異常的線(xiàn)程號(hào)

4、Thread Backtrace


發(fā)生Crash的線(xiàn)程的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í)刻雄右,線(xiàn)程的狀態(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)化解析肃廓。
二智厌、常見(jiàn)的Crash類(lèi)型
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ì)于此類(lèi)Crash哀蘑,我們應(yīng)該去審視自己App初始化時(shí)做的事情是否正確诚卸,是否在主線(xiàn)程請(qǐng)求了網(wǎng)絡(luò),或者其他耗時(shí)的事情卡住了正常初始化流程绘迁。
通常系統(tǒng)允許一個(gè)App從啟動(dòng)到可以相應(yīng)用戶(hù)事件的時(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,所以此類(lèi)問(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)畫(huà)面時(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可以參看我之前寫(xiě)的一篇文章IOS 內(nèi)存警告 Memory warning level
App在運(yùn)行過(guò)程中茬缩,系統(tǒng)內(nèi)存緊張時(shí)通常會(huì)先發(fā)警告赤惊,同時(shí)把后臺(tái)掛起的程序終止掉,最終如果還是內(nèi)存不夠的話(huà)就會(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
三、常見(jiàn)的Exception Type & Exception Code
1海铆、Exception Type
1)EXC_BAD_ACCESS
此類(lèi)型的Excpetion是我們最長(zhǎng)碰到的Crash迹恐,通常用于訪(fǎng)問(wèn)了不改訪(fǎng)問(wèn)的內(nèi)存導(dǎo)致。一般EXC_BAD_ACCESS后面的"()"還會(huì)帶有補(bǔ)充信息卧斟。
SIGSEGV: 通常由于重復(fù)釋放對(duì)象導(dǎo)致殴边,這種類(lèi)型在切換了ARC以后應(yīng)該已經(jīng)很少見(jiàn)到了。
SIGABRT: 收到Abort信號(hào)退出珍语,通常Foundation庫(kù)中的容器為了保護(hù)狀態(tài)正常會(huì)做一些檢測(cè)锤岸,例如插入nil到數(shù)組中等會(huì)遇到此類(lèi)錯(cuò)誤。
SEGV:(Segmentation Violation)板乙,代表無(wú)效內(nèi)存地址是偷,比如空指針,未初始化指針募逞,棧溢出等蛋铆;
SIGBUS:總線(xiàn)錯(cuò)誤,與 SIGSEGV 不同的是放接,SIGSEGV 訪(fǎng)問(wèn)的是無(wú)效地址刺啦,而 SIGBUS 訪(fǎng)問(wèn)的是有效地址,但總線(xiàn)訪(fǎng)問(wèn)異常(如地址對(duì)齊問(wèn)題)
SIGILL:嘗試執(zhí)行非法的指令透乾,可能不被識(shí)別或者沒(méi)有權(quán)限
2)EXC_BAD_INSTRUCTION

此類(lèi)異常通常由于線(xiàn)程執(zhí)行非法指令導(dǎo)致
3)EXC_ARITHMETIC

除零錯(cuò)誤會(huì)拋出此類(lèi)異常
2洪燥、Exception Code
0xbaaaaaad
此種類(lèi)型的log意味著該Crash log并非一個(gè)真正的Crash磕秤,它僅僅只是包含了整個(gè)系統(tǒng)某一時(shí)刻的運(yùn)行狀態(tài)。通撑踉希可以通過(guò)同時(shí)按Home鍵和音量鍵市咆,可能由于用戶(hù)不小心觸發(fā)

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

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)用戶(hù)強(qiáng)制關(guān)閉

三、獲取Crash的途徑
1针炉、本機(jī)
通過(guò)xCode連接測(cè)試機(jī)器挠他,直接在Device中即可讀取到該機(jī)器上發(fā)生的所有Crash log。
2篡帕、itunes connect
通過(guò)itunes connect后臺(tái)獲取到用戶(hù)上報(bào)的Crash日志殖侵。
3、第三方的Crash收集系統(tǒng)
有很多優(yōu)秀的第三方Crash收集系統(tǒng)大大的方便了我們收集Crash镰烧,甚至還帶了符號(hào)化Crash日志的功能拢军。比較常用的有CrashlyticsFlurry等怔鳖。
四茉唉、附錄
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)用棧结执,以及線(xiàn)程等信息寫(xiě)入文件度陆。一般都是直接寫(xiě)的16進(jìn)制地址,如果不經(jīng)過(guò)符號(hào)化的話(huà)昌犹,基本上很難獲取到有用信息坚芜,下一篇我們將聊一聊Crash日志的符號(hào)化,通俗點(diǎn)講就是讓Crash日志變成我們可讀的格式斜姥。

**

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸿竖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铸敏,更是在濱河造成了極大的恐慌缚忧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杈笔,死亡現(xiàn)場(chǎng)離奇詭異闪水,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蒙具,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)球榆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朽肥,“玉大人,你說(shuō)我怎么就攤上這事持钉『庹校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵每强,是天一觀的道長(zhǎng)始腾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)空执,這世上最難降的妖魔是什么浪箭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮辨绊,結(jié)果婚禮上奶栖,老公的妹妹穿的比我還像新娘。我一直安慰自己门坷,他們只是感情好驼抹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拜鹤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪流椒。 梳的紋絲不亂的頭發(fā)上敏簿,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音宣虾,去河邊找鬼惯裕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绣硝,可吹牛的內(nèi)容都是我干的蜻势。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鹉胖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼握玛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起甫菠,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挠铲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后寂诱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拂苹,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年痰洒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓢棒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浴韭。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脯宿,靈堂內(nèi)的尸體忽然破棺而出念颈,到底是詐尸還是另有隱情,我是刑警寧澤嗅绰,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布舍肠,位于F島的核電站,受9級(jí)特大地震影響窘面,放射性物質(zhì)發(fā)生泄漏翠语。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一财边、第九天 我趴在偏房一處隱蔽的房頂上張望肌括。 院中可真熱鬧,春花似錦酣难、人聲如沸谍夭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)紧索。三九已至,卻和暖如春菜谣,著一層夾襖步出監(jiān)牢的瞬間珠漂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工尾膊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媳危,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓冈敛,卻偏偏與公主長(zhǎng)得像待笑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抓谴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 一暮蹂、Crash文件結(jié)構(gòu) 當(dāng)程序運(yùn)行Crash的時(shí)候,系統(tǒng)會(huì)把運(yùn)行的最后時(shí)刻的運(yùn)行信息記錄下來(lái)癌压,存儲(chǔ)到一個(gè)文件中椎侠,也...
    周末年安閱讀 1,150評(píng)論 0 49
  • 一、Crash文件結(jié)構(gòu) 當(dāng)程序運(yùn)行Crash的時(shí)候措拇,系統(tǒng)會(huì)把運(yùn)行的最后時(shí)刻的運(yùn)行信息記錄下來(lái)我纪,存儲(chǔ)到一個(gè)文件中,也...
    yizhaorong閱讀 1,280評(píng)論 0 51
  • crash文件 當(dāng)運(yùn)行的APP發(fā)生crash的時(shí)候,如果代碼里面增加對(duì)應(yīng)的handler或者有第三方的crash ...
    Klaus_J閱讀 8,311評(píng)論 0 9
  • 【轉(zhuǎn)】http://www.cocoachina.com/ios/20150505/11731.html 開(kāi)發(fā)程序...
    艾倫噢耶閱讀 664評(píng)論 0 6
  • 大一上學(xué)期結(jié)束了浅悉。 小的時(shí)候趟据,看到大哥哥大姐姐去遠(yuǎn)方上大學(xué),總感覺(jué)遠(yuǎn)方很遠(yuǎn)术健,那時(shí)的我汹碱,以為小鎮(zhèn)就是全世界。 長(zhǎng)大了...
    傳奇小黑貓閱讀 221評(píng)論 0 2