iOS App Crash原理分析

时间:2022-05-11 11:27:26

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