崩潰信息構成
常見的崩潰日誌的頭部信息
如下:
Incident Identifier: B6FD1E8E-B39F-430B-ADDE-FC3A45ED368C
CrashReporter Key: f04e68ec62d3c66057628c9ba9839e30d55937dc
Hardware Model: iPad6,8
Process: TheElements [303]
Path: /private/var/containers/Bundle/Application/888C1FA2-3666-4AE2-9E8E-62E2F787DEC1/TheElements.app/TheElements
Identifier: com.example.apple-samplecode.TheElements
Version: 1.12
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: com.example.apple-samplecode.TheElements [402]
Date/Time: 2016-08-22 10:43:07.5806 -0700
Launch Time: 2016-08-22 10:43:01.0293 -0700
OS Version: iPhone OS 10.0 (14A5345a)
Report Version: 104
這些參數說明可以查看 官方文檔 Analyzing Crash Reports
Exception信息
- 一個進程因未捕獲的Objective-C異常而終止時生成的崩潰報告。
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0
- 一個空指針崩潰
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
Triggered by Thread: 0
常見的崩潰問題
-
壞內存訪問
[EXC_BAD_ACCESS // SIGSEGV // SIGBUS]
當崩潰堆棧頂部是
objc_msgSend
或者objc_release
這樣的,一般都是對已經釋放的對象發送消息。可以開啓殭屍模式Zombies instrument
來調試這種bug
當gpus_ReturnNotPermittedKillClient
在堆棧頂部,一般都是app嘗試在後臺使用OpenGL ES or Metal
渲染,可以見 QA1766: How to fix OpenGL ES application crashes when moving to the background -
異常退出
[EXC_CRASH // SIGABRT]
這種異常類型的崩潰最常見的原因是未捕獲的Objective-C/ c++
異常和對abort()
的調用。
如果應用程序擴展 Extension
啓動所需時間過久(例如被看門狗 Watch Dog
終止),則將使用此異常類型終止應用程序擴展。如果一個擴展在啓動時由於掛起而終止,那麼生成的崩潰報告的異常子類型將是LAUNCH_HANG
。因爲擴展沒有主函數,所以花在初始化上的任何時間都是在靜態構造函數和擴展庫中的+load
方法中進行的。你應該儘可能多地推遲這項工作。
看門狗Watch Dog
的崩潰異常代碼通常是“0x8badf00d”
,即“ate bad food”
。 -
跟蹤陷阱
[EXC_BREAKPOINT // SIGTRAP]
與異常退出類似,此異常旨在使附加的調試器有機會在進程執行的特定位置中斷進程。您可以使用_builtin_trap()
函數從您自己的代碼中觸發此異常。如果沒有附加調試器,則終止進程並生成崩潰報告。例如
[NSException raise:@"Bad" format:@"Test"];
觸發的類型就是SIGABRT
-
非法指令
[EXC_BAD_INSTRUCTION // SIGILL]
進程試圖執行非法或未定義的指令。進程可能試圖通過錯誤配置的函數指針跳轉到無效地址。在Intel處理器上,
ud2
操作碼會導致EXC_BAD_INSTRUCTION
異常,但通常用於捕獲進程以進行調試。如果在運行時遇到意外情況,Intel
處理器上的Swift
代碼將使用此異常類型終止。有關詳細信息,請參見跟蹤陷阱。 -
強制退出
[SIGQUIT]
例如鍵盤擴展應用(Extension)
加載時間過長,會被主程序(Main App)
退出。 -
被殺死
[SIGKILL]
在系統的請求下,進程被終止。查看終止原因字段以更好地理解終止的原因。終止原因字段將包含後跟代碼的名稱空間。以下代碼是針對
watchOS
的:終止碼
0xc51bad01
表示一個監視應用程序被終止了,因爲它在執行後臺任務時佔用了太多的CPU
時間。要解決這個問題,可以優化執行後臺任務的代碼以提高CPU
效率,或者減少在後臺運行應用程序時執行的工作量。
終止代碼0xc51bad02
表示一個監視應用程序被終止,因爲它未能在分配的時間內完成一個後臺任務。要解決這個問題,減少應用程序在後臺運行時執行的工作量。
終止碼0xc51bad03
表示一個監視應用程序未能在分配的時間內完成一個後臺任務,並且系統總體上非常繁忙,應用程序可能沒有收到足夠多的CPU時間來執行後臺任務。雖然一個應用程序可以通過減少它在後臺任務中執行的工作量來避免這個問題,但是0xc51bad03
並不表示這個應用程序做錯了什麼。更有可能的是,由於整個系統的負載,該應用程序無法完成其工作。 -
被保護的資源衝突
[EXC_GUARD]
該過程違反了受保護的資源保護。系統庫可能將某些文件描述符標記爲保護的,在此之後,對這些描述符的正常操作將觸發EXC_GUARD
異常(當系統希望對這些文件描述符進行操作時,系統使用特殊的“保護的”私有api)。這有助於快速跟蹤問題,比如關閉系統庫打開的文件描述符。例如,如果應用程序關閉用於訪問支持Core Data
存儲的SQLite文件
的文件描述符
,Core Data
將在很久以後神祕地崩潰。guard異常可以更快地發現這些問題,從而使它們更容易調試。 -
資源限制
[EXC_RESOURCE]
該流程超出了資源消耗限制。這是來自操作系統的通知,該進程使用了太多的資源。確切的資源在Exception Subtype
字段中列出。如果Exception Note
字段包含非致命條件,則即使生成了崩潰報告,進程也不會被終止。Exception Subtype
是MEMORY
表示進程已經超過了系統施加的內存限制。這可能是終止過多內存使用的前兆。
Exception Subtype
是WAKEUPS
表明進程中的線程每秒被喚醒太多次,這迫使CPU頻繁地喚醒,消耗電池壽命。
通常,這是由線程之間的通信(通常使用peformSelector:onThread:
或dispatch_async
)造成的,這種通信在不知情的情況下發生的頻率遠遠超出了預期。由於觸發此異常的通信類型非常頻繁,因此通常會有多個具有非常類似回溯的後臺線程——指示通信來自何處。 -
其他異常類型
一些崩潰報告可能包含一個未命名的Exception Type
,它將被打印爲十六進制值(例如00000020
)。如果您收到其中一個崩潰報告,請直接查看Exception Codes
字段以獲取更多信息。Exception Codes
爲0xbaaaaaad
表明日誌是整個系統的堆棧,而不是崩潰報告。要拍攝堆疊,請同時按側鍵和兩個音量鍵。這些日誌通常是用戶偶然創建的,它們並不表示錯誤。
Exception Codes
爲0xbad22222
表示一個VoIP應用程序
已經被iOS終止了,因爲它恢復得太頻繁了。
Exception Codes
爲0x8badf00d
表示,由於發生了看門狗超時,iOS已經終止了應用程序。應用程序啓動、終止或響應系統事件花費了太長時間。一個常見的原因是在主線程上執行同步網絡
。線程0(Main)
上的任何操作都需要移動到後臺線程,或者以不同的方式處理,這樣它就不會阻塞主線程。
Exception Codes
爲0xc00010ff
表示應用程序在響應熱事件( thermal event.)
時被操作系統殺死。這可能是由於發生崩潰的特定設備或操作它的環境出現了問題。有關如何讓你的應用程序運行得更有效率的技巧,請參閱 iOS Performance and Power Optimization with Instruments 。
Exception Codes
爲0xdead10cc
表示一個應用程序已經被OS
終止,因爲它在掛起期間持有一個文件鎖
或sqlite數據庫鎖
。如果您的應用程序在掛起時對一個鎖定的文件
或sqlite數據庫
執行操作,那麼它必須請求額外的後臺執行時間來完成這些操作,並在掛起之前釋放鎖。
Exception Codes
爲0x2bad45ec
表明,由於安全衝突,iOS已經終止了一個應用程序。終止描述“Process detected doing insecure drawing while in secure mode”
,表示應用程序試圖在不允許的情況下(比如在屏幕鎖定的情況下)向屏幕繪圖。用戶可能沒有注意到這個終止,因爲當這個終止發生時,屏幕是關閉的或鎖屏顯示的。
使用
應用程序切換器 app switcher(Home鍵出現的切換界面)
終止掛起的應用程序不會生成崩潰報告。一旦應用程序被掛起,它可以在任何時候被iOS終止,所以不會產生崩潰報告。
額外的診斷信息
本節包括特定於終止類型的額外診斷信息,其中可能包括:
特定應用程序的信息 Application Specific Information
:在進程終止之前捕獲的框架錯誤消息
內核消息 Kernel Messages
:關於代碼簽名問題的詳細信息
Dyld錯誤消息 Dyld Error Messages
:動態鏈接器發出的錯誤消息
從macOS Sierra、iOS 10、watchOS 3和tvOS 10
開始,大多數信息現在都報告在異常信息 Exception Information下的Termination Reason
字段中。
- 進程因鏈接到的框架無法找到而終止時生成的崩潰報告。
Dyld Error Message:
Dyld Message: Library not loaded: @rpath/MyCustomFramework.framework/MyCustomFramework
Referenced from: /private/var/containers/Bundle/Application/CD9DB546-A449-41A4-A08B-87E57EE11354/TheElements.app/TheElements
Reason: no suitable image found.
- 摘自進程因未能快速加載其初始視圖控制器而終止時生成的崩潰報告。
Application Specific Information:
com.example.apple-samplecode.TheElements failed to scene-create after 19.81s (launch took 0.19s of total time limit 20.00s)
Elapsed total CPU time (seconds): 7.690 (user 7.690, system 0.000), 19% CPU
Elapsed application CPU time (seconds): 0.697, 2% CPU