iOS App Crash原理分析
预备知识: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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
最新文章
- DevExtreme 学习应用[1]
- golang笔记——包
- LeetCode-Repeated DNA Sequences (位图算法减少内存)
- mysql执行完select后,释放游标
- 追加文件内容java
- java调用webservice
- Akka(20): Stream:压力缓冲-Batching backpressure and buffering
- 72、django之简单验证码实现与form表单钩子函数补充
- 编译装php7.2 &;&; nginx-1.14
- NPOI操作Excel(一)--NPOI基础
- 【LeetCode每天一题】Reverse Linked List(链表反转)
- Redis 非关系性数据库集群的搭建与常用方法
- Java转义emoji等特殊符号
- 牛客OI周赛4-提高组-C-战争[并查集]
- (笔记)Mysql命令mysqladmin:修改用户密码
- REST接口设计规范总结
- c++主程这种事情,就是这样,看人先看人品,没人品,他的能力与你何关?
- sublime_text3常用操作与快捷键
- Bootstrap-table固定表头并解决表头与内容不对齐
- 环境变量PATH超长问题[转]
热门文章
- 新IOS编程语言 Swift 新编译器Xcode6
- 关于ListView的setEmptyView没效果的问题
- ubuntu安装wine 安装QQ
- Size Classes with Xcode 6:为所有的尺寸准备一个Storyboard
- 2018.09.08 DL24 Day1 总结
- 6 Workbook 对象
- 第八周 Leetcode 44. Wildcard Matching 水题 (HARD)
- bzoj1531
- bzoj 1571: [Usaco2009 Open]滑雪课Ski【dp】
- 洛谷P4397 [JLOI2014]聪明的燕姿