預(yù)備知識:OS X系統(tǒng)分析
1.內(nèi)核XNU是Darwin的核心,也是整個OS X的核心。XNU本身由以下幾個組件構(gòu)成:
Mach微核心
BSD層
libKern
I/O Kit
此外饮醇,內(nèi)核是模塊化的浪漠,允許根據(jù)需要動態(tài)加載插件形式的內(nèi)核擴展陕习。
2.Mach:XNU的核心,Mach僅能處理操作系統(tǒng)最基本的職責(zé):
進程和線程抽象址愿。
虛擬內(nèi)存管理
任務(wù)調(diào)度
進程間通信和消息傳遞機制(例如:NSMachPort)
3.所以O(shè)S X是在Mach內(nèi)核的基礎(chǔ)上構(gòu)建的该镣,蘋果不鼓勵直接只用Mach的API,但是Mach系統(tǒng)調(diào)用仍然可以在用戶態(tài)訪問响谓。而BSD層是對Mach內(nèi)核的封裝省艳,任何額外的功能,比如文件和設(shè)備的訪問嫁审,都是在BSD層實現(xiàn)的跋炕。
4.BSD: 是建立在Mach之上,提供更可靠的API,提供了POSIX兼容性土居。BSD層提供了更高層次的抽象枣购,包括:
UNIX進程模型
POSIX線程模型及其相關(guān)的同步原語
網(wǎng)絡(luò)協(xié)議棧
UNIX用戶和組
文件系統(tǒng)訪問
設(shè)備訪問
iOS Crash原理分析
iOS系統(tǒng)的Exception Type項通常包含兩個元素:Mach異常和Unix信號擦耀。
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS 0x041a6f3
Mach的部分API暴露給用戶態(tài),用戶態(tài)的開發(fā)者可以直接通過Mach API設(shè)置thread, task, host的異常端口來捕獲異常分瘾,摘取Crash事件吁系。所有的Mach異常都在host層被ux_exception轉(zhuǎn)換成對應(yīng)的Unix信號德召,并通過threadsignal將信號投遞到出錯的線程汽纤。那么就可以通過注冊signalHandler來獲取信號signal(SIGSEGV,signalHandler);
crash捕獲途徑:
1.Mach異常
2.Unix信號
優(yōu)選Mach異常,因為Mach異常處理會先于Unix信號處理發(fā)生蕴坪,如果Mach異常的handler讓程序exit了,那么Unix信號就永遠不會到達這個進程了呆瞻。轉(zhuǎn)換Unix信號是為了兼容更為流行的POSIX標(biāo)準(zhǔn)(SUS規(guī)范)径玖,這樣不必了解Mach內(nèi)核也可以通過Unix信號的方式來兼容開發(fā)痴脾。
總結(jié):所以通常代碼中的只捕獲Exception是不夠的梳星。
業(yè)務(wù)分析:KSCrash學(xué)習(xí)筆記
1.在KSCrashInstallation install的時候,調(diào)用KSCrash(在init中獲取應(yīng)用名稱和應(yīng)用安裝路徑)的install方法薯定,在此方法中瞳购,獲取應(yīng)用的地址和應(yīng)用的bundleName路徑作為crash.json文件的存放路徑。在crash發(fā)生的時候,將crash信息存入之路經(jīng)的文件中吞杭。
2.在應(yīng)用啟動的時候,通過KSCrash的loadCrashReportJSONWithID方法獲取crash.json文件路徑芽狗,最終通過KSCrashReportStore的getCrashReportPathByID方法獲取文件路徑痒蓬,然后通過KSCrashReportStore kscrs_readReport獲取crash.json文件。
詳細(xì)的學(xué)習(xí)筆記后續(xù)會給出來攻晒。