最近用友盟看到一些崩潰信息。但是上面的崩潰信息是如下圖顯示的,這是一些符號化信息员凝,基本上很難看出來崩潰在哪里橙困。
這時候我們就需要根據(jù)符號表來監(jiān)測奔潰位置###
- 什么是符號表
符號表就是指在Xcode項目編譯后瞧掺,在編譯生成的二進(jìn)制文件.app的同級目錄下生成的同名的.dSYM文件。
.dSYM文件其實是一個目錄凡傅,在子目錄中包含了一個16進(jìn)制的保存函數(shù)地址映射信息的中轉(zhuǎn)文件辟狈,所有Debug的symbols都在這個文件中(包括文件名、函數(shù)名像捶、行號等)上陕,所以也稱之為調(diào)試符號信息文件。
- 如何得到.dsYM文件
我們在Archive的時候會生成.xcarchive文件拓春,然后顯示包內(nèi)容就能夠在里面找到.dsYM文件和.app文件释簿。
- 如何使用.dsYM
如果是使用友盟的話,我們能在錯誤列表里看到一些錯誤硼莽,然后可以導(dǎo)出奔潰信息庶溶,導(dǎo)出的文件為.csv文件煮纵。友盟有一個分析工具,使用那個工具可以看到一些錯誤的函數(shù)偏螺,行號等行疏。但是很容易分析失敗,不知道為什么套像?
注意:使用的時候要確保你的.xcarchive在 ~/Library/Developer/Xcode/或該路徑的子目錄下酿联。
.xcarchive里的.dsYM文件和.app文件是有對應(yīng)的UUID的。然后你的錯誤詳情里也是有UUID夺巩,只有當(dāng)UUID相等時才能分析對贞让。
我犯的錯誤:因為我們是兩個人開發(fā),Archive的時候都是在另一個人的電腦上Archive的柳譬,所以我的電腦里根本沒有對應(yīng)的.xcarchive文件喳张。所以我在我電腦上用友盟的分析工具分析是時候是監(jiān)測不出來錯誤的。
或者自己找到.xcarchive文件和錯誤內(nèi)存地址(友盟錯誤詳情里標(biāo)綠色的為錯誤內(nèi)存地址)美澳。然后通過一個小應(yīng)用來分析出對應(yīng)的函數(shù)销部。應(yīng)用下載地址,具體可參考文章dSYM 文件分析工具
奔潰日志分析###
以上是一個完整的崩潰日志。其實友盟錯誤詳情里的就是上圖的第4部分制跟。
崩潰日志可以從xcode里打開Devices看到對應(yīng)手機的一些奔潰信息舅桩。點擊下圖的View Device Logs就能看到崩潰日志
(3) 異常
在這部分,你可以看到閃退發(fā)生時拋出的異常類型凫岖。還能看到異常編碼和拋出異常的線程江咳。根據(jù)崩潰報告類型的不同,在這部分你還能看到一些另外的信息哥放。
Exception Type:異常類型
SIGABRT:
通常, SIGABRT 異常是由于某個對象接收到未實現(xiàn)的消息引起的歼指。 或者,用簡單的話說甥雕,在某個對象上調(diào)用了不存在的方法踩身。
Exception Codes:異常編碼
0x8badf00d: 讀做 “ate bad food”! (把數(shù)字換成字母,是不是很像 :p)該編碼表示應(yīng)用是因為發(fā)生watchdog超時而被iOS終止的社露。 通常是應(yīng)用花費太多時間而無法啟動挟阻、終止或響應(yīng)用系統(tǒng)事件。
0xbad22222: 該編碼表示 VoIP 應(yīng)用因為過于頻繁重啟而被終止峭弟。
0xdead10cc: 讀做 “dead lock”!該代碼表明應(yīng)用因為在后臺運行時占用系統(tǒng)資源附鸽,如通訊錄數(shù)據(jù)庫不釋放而被終止 。
0xdeadfa11: 讀做 “dead fall”! 該代碼表示應(yīng)用是被用戶強制退出的瞒瘸。根據(jù)蘋果文檔, 強制退出發(fā)生在用戶長按開關(guān)按鈕直到出現(xiàn) “滑動來關(guān)機”, 然后長按 Home按鈕坷备。強制退出將產(chǎn)生 包含0xdeadfa11 異常編碼的崩潰日志, 因為大多數(shù)是強制退出是因為應(yīng)用阻塞了界面。
(4) 線程回溯
這部分提供應(yīng)用中所有線程的回溯日志情臭。 回溯是閃退發(fā)生時所有活動幀清單省撑。它包含閃退發(fā)生時調(diào)用函數(shù)的清單赌蔑。看下面這行日志:
它包括四列:
幀編號—— 此處是2竟秫。(數(shù)子從大到小為發(fā)生的順序)
二進(jìn)制庫的名稱 ——此處是 XYZLib.
調(diào)用方法的地址 ——此處是 0x34648e88.
第四列分為兩個子列娃惯,一個基本地址和一個偏移量。此處是0×83000 + 8740, 第一個數(shù)字指向文件肥败,第二個數(shù)字指向文件中的代碼行趾浅。
低內(nèi)存的奔潰日志有點不一樣:
如何從容的崩潰###
github源碼
這是一個github上的防止奔潰的源碼,可以使一些原本會奔潰的操作彈出UIAlertView拙吉。
用這種方法雖然不會崩潰了潮孽,但是就不會發(fā)送奔潰信息了,我們在Devices Logs里就看不到奔潰日志了筷黔,這是一個不好的地方。有大神知道怎么解決嗎仗颈?
//這里是個奔潰的代碼
NSArray *arry=[NSArray arrayWithObject:@"sss"];
NSLog(@"%@",[arry objectAtIndex:1]);
執(zhí)行以上代碼后會如下圖所示: