1. 程式人生 > >iOS App Crash原理分析

iOS App Crash原理分析

加載 threads 需要 理發 handler 事件 設置 額外 內存

預備知識: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原理分析