一显晶、崩潰類型
- 應(yīng)用層存在bug 娄琉,即OC程序崩潰
如 數(shù)組越界往果,selector方法沒實現(xiàn)等拋出一系列NSException
可通過系統(tǒng)API 注冊UncaughtNSException處理函數(shù)捕捉役听,定位比較容易- 違反系統(tǒng)規(guī)則而出錯
如 watchdog超時颓鲜,訪問了不屬于本進程的內(nèi)存地址,用戶強制退出,低內(nèi)存終止等典予,系統(tǒng)拋出unix信號甜滨,但沒有錯誤堆站信息
可通過注冊信號處理函數(shù)捕捉,但只能補拙有限的幾種類型熙参,定位較困難
二艳吠、Crash日志,幾個重要的關(guān)鍵詞
1孽椰、 進程信息
第一部分是閃退進程的相關(guān)信息:
- Incident Identifier : 是崩潰報告的唯一標識符昭娩。
- CrashReporter Key: 是與設(shè)備標識相對應(yīng)的唯一鍵值。同一個設(shè)備上同一版本的App發(fā)生Crash時黍匾,該值都是一樣的栏渺。雖然它不是真正的設(shè)備標識符,但也是一個非常有用的情報:如果你看到100個崩潰日志的CrashReporter Key值都是相同的锐涯,或者只有少數(shù)幾個不同的CrashReport值磕诊,說明這不是一個普遍的問題,只發(fā)生在一個或少數(shù)幾個設(shè)備上。
- Hardware Model :標識設(shè)備類型霎终。 如果很多崩潰日志都是來自相同的設(shè)備類型滞磺,說明應(yīng)用只在某特定類型的設(shè)備上有問題。上面的日志里莱褒,崩潰日志產(chǎn)生的設(shè)備是iPhone 4s击困。
- Process:代表Crash的進程名稱,通常都是我們的App的名字, []里面是當時進程的ID
- Path:崩潰文件的路徑
- Identifier:項目標識符广凸,就是Bundle Id
- Version:版本號
- Code Type:當前App的CPU架構(gòu)
- Parent Process:當前進程的父進程阅茶,由于iOS中App通常都是單進程的,一般父進程都是launchd
2谅海、基本信息
這部分給出了一些基本信息
- Date/Time:閃退發(fā)生的日期
- Launch Time:進入應(yīng)用的時間
- OS Version:設(shè)備的iOS版本
- Report Version-Crash:日志的格式脸哀,目前基本上都是104,不同的version里面包含的字段可能有不同
3扭吁、異常信息
- Exception Type:異常的類型撞蜂。
- Exception Codes :異常錯誤碼
- Termination Reason:閃退的原因,比如常見的數(shù)組越界啊侥袜,什么的谅摄。
- Triggered by Thread:出現(xiàn)問題在哪個線程,這個比較重要系馆,首先確定在哪個線程中出了問題送漠,然后再去定位。
4由蘑、線程回溯
這部分提供應(yīng)用中所有線程的回溯日志闽寡。
回溯是閃退發(fā)生時所有活動幀清單。它包含閃退發(fā)生時調(diào)用函數(shù)的清單. 線程調(diào)用的一些堆棧信息尼酿,壓根看不懂爷狈,所有需要進行符號化處理∩亚妫看下面這行日志:
05 UIKit 0x00000001943bd7fc 0x194343000 + 501756
它包括四列:
幀編號—— 此處是12涎永。
二進制庫的名稱 ——此處是 UIKit
調(diào)用方法的地址 ——此處是 0x00000001943bd7fc
第四列分為兩個子列,一個基本地址和一個偏移量鹿响。此處是0x194343000 + 501756, 第一個數(shù)字指向文件羡微,第二個數(shù)字指向文件中的代碼行。
5惶我、 二進制映像(Binary Images)
這部分列出了當Crash發(fā)生時被裝載進進程內(nèi)存空間的依賴庫或者模塊
三妈倔、異常類型信息
1、Exception Type
1)EXC_BAD_ACCESS
此類型的Excpetion是我們最長碰到的Crash绸贡,通常用于訪問了不改訪問的內(nèi)存導(dǎo)致盯蝴。一般EXC_BAD_ACCESS后面的"()"還會帶有補充信息毅哗。
- SIGSEGV: 通常由于重復(fù)釋放對象導(dǎo)致,這種類型在切換了ARC以后應(yīng)該已經(jīng)很少見到了捧挺。
- SIGABRT: 收到Abort信號退出虑绵,SIGABRT 異常是由于某個對象接收到未實現(xiàn)的消息引起的。
SEGV:(Segmentation Violation)闽烙,代表無效內(nèi)存地址蒸殿,比如空指針,未初始化指針鸣峭,棧溢出等;
- SIGBUS:總線錯誤酥艳,與 SIGSEGV 不同的是摊溶,SIGSEGV 訪問的是無效地址,而 SIGBUS 訪問的是有效地址充石,但總線訪問異常(如地址對齊問題)
- SIGILL:嘗試執(zhí)行非法的指令莫换,可能不被識別或者沒有權(quán)限
2)EXC_BAD_INSTRUCTION
此類異常通常由于線程執(zhí)行非法指令導(dǎo)致
3)EXC_ARITHMETIC
除零錯誤會拋出此類異常
2、Exception Code 異常編碼
前面日至的第3部分找到異常編碼骤铃。有些編碼比較常見拉岁。通常,異常編碼以一些文字開頭惰爬,緊接著是一個或多個十六進制值喊暖,此數(shù)值正是說明閃退根本性質(zhì)的所在。 從這些編碼中撕瞧,可以區(qū)分出閃退是因為程序錯誤陵叽、非法內(nèi)存訪問或者是其他原因
常見的異常編碼:
- 0xbaaaaaad 此種類型的log意味著該Crash log并非一個真正的Crash,它僅僅只是包含了整個系統(tǒng)某一時刻的運行狀態(tài)丛版。通彻簦可以通過同時按Home鍵和音量鍵,可能由于用戶不小心觸發(fā)
- 0xbad22222 當VOIP(指在 IP 網(wǎng)絡(luò)上使用 IP 協(xié)議以數(shù)據(jù)包的方式傳輸語音)程序在后臺太過頻繁的激活時页畦,系統(tǒng)可能會終止此類程序
- 0x8badf00d 程序啟動或者恢復(fù)時間過長被watch dog終止胖替,通常是應(yīng)用花費太多時間而無法啟動、終止或響應(yīng)用系統(tǒng)事件
- 0xc00010ff 程序執(zhí)行大量耗費CPU和GPU的運算豫缨,導(dǎo)致設(shè)備過熱独令,觸發(fā)系統(tǒng)過熱保護被系統(tǒng)終止
- 0xdead10cc 程序退到后臺時還占用系統(tǒng)資源,如通訊錄被系統(tǒng)終止
- 0xdeadfa11 程序無響應(yīng)好芭,用戶強制關(guān)閉
(注意: 在后臺任務(wù)列表中關(guān)閉已掛起的應(yīng)用不會產(chǎn)生崩潰日志记焊。 一旦應(yīng)用被掛起,它何時被終止都是合理的栓撞。所以不會產(chǎn)生崩潰日志遍膜。)
四碗硬、低內(nèi)存崩潰
低內(nèi)存崩潰日志與其他類型的崩潰日志很不一樣,它們不指向特定的文件和代碼行瓢颅。相反恩尾,它們畫出了閃退時設(shè)備上的內(nèi)存使用情況的圖表
頭部還是跟其他崩潰日志很像的: 提供了 Incident Identifier, CrashReporter Key, Hardware Model, OS Version等信息。
接下來部分是低內(nèi)存崩潰日志特有的:
- Free pages 指可用內(nèi)存頁數(shù)挽懦。每頁大小約是4KB, 上面的日志中翰意,可用內(nèi)存約為3,872 KB (或者說 3.9 MB)。
- Purgeable pages 是那部分可被清除或重用的內(nèi)存信柿。在上面的日志中冀偶,是0KB。
- Largest process是閃退時使用大部分內(nèi)存的應(yīng)用名稱渔嚷,在上面的日志中进鸠,正是你的應(yīng)用!
- Processes顯示了閃退時各進程列表,還包含內(nèi)存使用量形病。包含進程名 (第一列), 進程唯一標識符(第二名), 進程使用的內(nèi)存頁數(shù)(第三列)客年。最后一列是每個應(yīng)用的狀態(tài)。通常漠吻,發(fā)生閃退的應(yīng)用的狀態(tài)是 frontmost量瓜。