iOS App Crash原理分析
預備知識:OS X系統分析
1.內核XNU是Darwin的核心,也是整個OS X的核心。XNU本身由以下幾個組件構成:
Mach微核心
BSD層
libKern
I/O Kit
此外,內核是模塊化的,允許根據需要動態加載插件形式的內核擴展。
2.Mach:XNU的核心,Mach僅能處理操作系統最基本的職責:
進程和線程抽象。
虛擬內存管理
任務調度
進程間通信和消息傳遞機制(例如:NSMachPort)
3.所以OS X是在Mach內核的基礎上構建的,蘋果不鼓勵直接只用Mach的API,但是Mach系統調用仍然可以在用戶態訪問。而BSD層是對Mach內核的封裝,任何額外的功能,比如文件和設備的訪問,都是在BSD層實現的。
4.BSD: 是建立在Mach之上,提供更可靠的API,提供了POSIX兼容性。BSD層提供了更高層次的抽象,包括:
UNIX進程模型
POSIX線程模型及其相關的同步原語
網絡協議棧
UNIX用戶和組
文件系統訪問
設備訪問
iOS Crash原理分析
iOS系統的Exception Type項通常包含兩個元素:Mach異常和Unix信號。
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS 0x041a6f3
Mach的部分API暴露給用戶態,用戶態的開發者可以直接通過Mach API設置thread, task, host的異常端口來捕獲異常,摘取Crash事件。所有的Mach異常都在host層被ux_exception轉換成對應的Unix信號,並通過threadsignal將信號投遞到出錯的線程。那麽就可以通過註冊signalHandler來獲取信號signal(SIGSEGV,signalHandler);
crash捕獲途徑:
1.Mach異常
2.Unix信號
優選Mach異常,因為Mach異常處理會先於Unix信號處理發生,如果Mach異常的handler讓程序exit了,那麽Unix信號就永遠不會到達這個進程了。轉換Unix信號是為了兼容更為流行的POSIX標準(SUS規範),這樣不必了解Mach內核也可以通過Unix信號的方式來兼容開發。
總結:所以通常代碼中的只捕獲Exception是不夠的。
作者:簡單的快樂著
鏈接:http://www.jianshu.com/p/c2212058161f
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
iOS App Crash原理分析