预备知识: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來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。