一、概述
“異?!边@個詞在“崩潰日志”語境下更多與“Mach 異?!保ㄒ?EXC_ 為前綴)和 UNIX 信號(如: SIGSEGV, SIGBUS等)相關。
1、UNIX信號,詳見Unix_signal
常見的有:
SIGSEGV,訪問無效的內存地址。
地址存在,但是應用程序無法訪問。SIGABRT,程序崩潰。
由 C函數abort()初始化。通常意味著系統(tǒng)檢測到某些事務出錯,例如assert()或者NSAssert()校驗失敗。SIGBUS,訪問無效的內存地址。
地址不存在,或對齊無效。(The address does not exist, or the alignment is invalid.)
2、Mach 異常,詳見 Mach-EXC (sys/osfmk/mach/exception_types.h)的源碼文件。
常見的有:
-
EXC_BAD_ACCESS,錯誤內存訪問 -
EXC_CRASH,異常跳出 -
SIGBUS,訪問無效的內存地址。地址不存在,或對齊無效。 -
EXC_BREAKPOINT,跟蹤/斷點捕獲
通用與 SIGTRAP 相關聯??梢杂赡阕约旱拇a或者 NSExceptions 拋出時觸發(fā)。 -
EXC_GUARD,違反了受保護資源的防護(Violated Guarded Resource Protection)
由違背受保護資源防護觸發(fā),例如‘某些文件描述符’。 -
EXC_BAD_INSTRUCTION,非法指令,通常與特定非法或未定義指令/操作數相關。 -
EXC_RESOURCE,資源限制,應用由于達到資源消耗限制而退出。 -
00000020,十六進制異常類型,非 'OS Kernel' 異常。
二、EXC_BAD_ACCESS
1、概述
開發(fā)中經常遇到EXC_BAD_ACCESS的崩潰信息,如果使用lldb的bt打印堆棧,能對位具體代碼是比較容易解決問題的。但也會遇到一些死在系統(tǒng)庫,莫名錯誤引起的,就很難定位和排查問題。
它到底是什么問題引起的呢?具體要怎么分析?從哪里入手分析呢?帶著疑問,找資料,學習匯總,以便查閱。
蘋果官方給出EXC_BAD_ACCESS的解釋是,其是一個能被捕獲語言異常,是關于內存訪問方面的錯誤。
the EXC_BAD_ACCESS exception rules out that a crash is due to an uncaught language exception.
The crash is due to a memory access issue.
EXC_BAD_ACCESS的堆棧錯誤
thread #39, queue = 'com.apple.root.default-qos', stop reason = EXC_BAD_ACCESS (code=2, address=0x13001c040)EXC_BAD_ACCESS的崩潰日志
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000011
我們發(fā)現EXC_BAD_ACCESS(code=2, address=0x13001c040)錯誤信息給出兩個字段,一個是address代表出錯的內存地址;code是啥意思呢?
2、EXC_BAD_ACCESS常見的錯誤子類型
上面錯誤中這個code代表的是異常的子類型,具體是啥呢?常見有以下幾種,詳見源碼
-
KERN_INVALID_ADDRESS == 1
The crashed thread accessed unmapped memory, either by accessing data or an instruction fetch.
由訪問未映射內存的線程引起的,它可能由數據訪問或指令提取觸發(fā)。訪問已經被 ARC 釋放(導致地址變?yōu)椴豢稍L問)的對象。如果是這個情況,你通??梢栽诒罎⑷罩局械?“Backtrace” 頂部附近看到
objc_release。
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x6d783f44
-
KERN_PROTECTION_FAILURE == 2
The crashed thread tried to use a valid memory address that’s protected. Some types of protected memory include read-only memory regions, or nonexecutable memory regions.
訪問受保護的內存地址,例如制度內存區(qū)域 或者 不可執(zhí)行的內存區(qū)域。
經常導致的原因就是訪問某些尚未初始化的對象(SIGBUS) ,如下
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000011
-
KERN_MEMORY_ERROR
The crashed thread tried to access memory that couldn’t return data at that moment, such as a memory-mapped file that became unavailable.
訪問無法返回數據的內存區(qū)域,例如無效非法的文件。
3、如何定位EXC_BAD_ACCESS更多信息
- 在debug運行是打開內存管理的
Zombie Objects可以獲得有效的調試信息。
三、EXC_CRASH(異常跳出)
它通常發(fā)生在對象接收到未實現的消息時,如 Xcode 調試器中顯示的 “unrecognized selector sent to instance 0x6a33840”。
另一個常見的“EXC_CRASH”情況是關于“應用擴展(App Extensions)”。
應用擴展如果“花了太長時間來初始化”則會被系統(tǒng)終止。在這種情況下,異常子類型顯示為LAUNCH_HANG
Exception Type: EXC_CRASH (SIGABRT)
Exception Subtype: LAUNCH_HANG
Exception Message: The extension took too much time to initialize
四、EXC_RESOURCE
“EXC_RESOURCE”意思是進程“達到資源消耗上限”。通常,當你的應用在一定時間內持續(xù)超出限制時會被觸發(fā)。
這個異常包含“Exception Subtype”以幫助理解實際情況:
- CPU - 限制為 50%,時間不超過 180秒。
- WAKEUPS - 表示線程每秒喚醒次數太多。限制為 150次/每秒, 時間不超過 300秒。
- MEMORY - 沒有相關文檔描述限制信息。
Exception Type: EXC_RESOURCE
Exception Subtype: CPU
Exception Message: (Limit 50%) Observed 85% over 180 secs
---
Exception Type: EXC_RESOURCE
Exception Subtype: WAKEUPS
Exception Message: (Limit 150/sec) Observed 206/sec over 300 secs
---
Exception Type: EXC_RESOURCE
Exception Subtype: MEMORY
Exception Message: Crossed High Water Mark
五、00000020
與“EXC_”異常不同,這個“異常類型”實際上不能告訴你任何信息。取而代之,你應該查看“異常代碼”獲取更多詳情。
-
0x8badf00d(讀作 ate bad food)- 表示由于 watchdog 出現超時而導致應用被操作系統(tǒng)終止。通常意味著應用程序花了太長時間啟動、關閉或者響應系統(tǒng)事件。一個非常典型的情況是“在主線程上做同步網絡請求”。 -
0xbaaaaaad(讀作 “plooookhy”)- 表示日志是整個系統(tǒng)的堆棧,而不是崩潰報告。 -
0xc00010ff(讀作 cool off(冷靜))- 表示應用程序被系統(tǒng)關閉以響應熱事件。 -
0xbad22222- 表示操作系統(tǒng)終止了一個VoIP程序,因為它過于頻繁的執(zhí)行恢復。 -
0xdead10cc(讀作 dead lock(死鎖))- 表示應用在后臺運行時保持了系統(tǒng)資源。 -
0xdeadfa11(讀作 deadfall)- 表示應用被用戶強制關閉了。強制關閉發(fā)生于用戶先按下電源鍵直到“滑動來關機”出現然后按住主屏幕按鈕。
參考
在exc_bad_access中,代碼=1和代碼=2有什么區(qū)別?
Diagnosing Issues Using Crash Reports and Device Logs
Understanding the Exception Types in a Crash Report
Investigating Memory Access Crashes
譯:理解 iOS 異常類型
iOS Abort問題系統(tǒng)性解決方案