iOS系統自帶的 Apple’s Crash Reporter 記錄在設備中的Crash日志,Exception Type項通常會包含兩個元素:
Mach異常如 :EXC_BAD_ACCESS
Unix信號如 : SIGSEGV。
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x041a6f3
- 所有Mach異常都在host層被ux_exception轉換為相應的Unix信號,并通過threadsignal將信號投遞到出錯的線程。
- EXC_BAD_ACCESS (SIGSEGV)表示的意思是:Mach層的EXC_BAD_ACCESS異常,在host層被轉換成SIGSEGV信號投遞到出錯的線程。既然最終以信號的方式投遞到出錯的線程,那么就可以通過注冊signalHandler來捕獲信號: signal(SIGSEGV,signalHandler);
- 正如上述所說,可以通過捕獲Mach異常、或Unix信號兩種方式來抓取crash事件,于是總結起來實現方案就一共有3種。
- Mach異常方式
- Unix信號方式 : signal(SIGSEGV,signalHandler)
- Mach異常+Unix信號方式