標籤:部分 獲得 出錯 ios 額外 訊息 strong com ios系統
預備知識: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原理分析