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

iOS App Crash原理分析的更多相关文章

  1. iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    时间2013-08-20 12:49:20 GoWhich原文  http://www.gowhich.com/blog/view/id/343 苹果官方 Crash文件分析方法 (iOS系统Cras ...

  2. iOS app签名原理

    基本原理: 公钥能够验证私钥的签名是否正确. Apple后台有一个私钥A,iOS内置一个公钥A,与私钥A对应.(A:代表Apple,即苹果) 本地产生一对公钥L.私钥L,(L:代表Local,即本地) ...

  3. ios系统crash文件分析

    分析crash文件必备条件:crash文件的uuid,app的uuid,dsym文件的uuid必须一致 1> crash文件的uuid为Binary Images:0x4000 - 0x1173 ...

  4. 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...

  5. (转载)iOS系统Crash文件分析方法

    转自: http://ios-iphone.diandian.com/post/2012-05-18/19440182 Xcode 4.3的symbolicatecrash的位置和老版本的不一致了. ...

  6. ios app抓包分析

    1 使用rvictl工具 这是mac下的一条命令.ios usb连mac,然后创建虚拟网络接口. 2 使用wireshark抓包 wireshark可以抓这个虚拟网络接口上的数据包.

  7. Crash日志分析

    从Crash文件出发解决bug的一般步骤,分三步: a, 获取设备上的崩溃日志. b, 分析崩溃日志,找到报错位置(定位到函数和代码行数). c, 打开代码,改bug. 1, 获取设备日志 1. 在可 ...

  8. iOS crash日志分析

    iOS crash日志分析 一. 寻找crash文件:手机崩溃后的ips或者crash文件(ips文件可以直接修改成crash文件,直接改后缀名就可以了),这里说下如何拿到crash文件 1. 把运行 ...

  9. 【腾讯Bugly干货分享】iOS App 签名的原理

    本文来自 WeRead 团队博客: http://wereadteam.github.io/ iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,Ce ...

随机推荐

  1. C++入门学习——模板

    为什么须要模板? 我们已经学过重载(Overloading),对重载函数而言,C++ 通过函数參数(參数个数.參数类型)的正确匹配来调用重载函数.比如.为求两个数的最大值,我们定义 max () 函数 ...

  2. SDK Manager配置

    改Host的都是扯淡,现在不好使了.. 还是使用东软的国内镜像好使,打开SDK Manager Tools - Options Http proxy Server:  mirrors.neusoft. ...

  3. Java后端发出post请求带参数并接收返回的json

    核心代码: 参数格式: “key1=value1&key2=value2” /*** sendUrl    (远程请求的URL)* param    (远程请求参数)* JSONObject  ...

  4. Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法

    检查linux发现server中的磁盘分区空间超过98%,登录到服务器查看 [root@localhost etc]# df -hFilesystem 容量 已用 可用 已用% 挂载点/dev/hda ...

  5. YTU 2547: Repairing a Road

    2547: Repairing a Road 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 2 题目描述 You live in a small town with R b ...

  6. [noi.ac_D1T2]sort

    https://www.zybuluo.com/ysner/note/1289967 题面 定义"翻转排序":每次操作均为把区间\([l,r]\)中所有数倒过来,即\(swap(a ...

  7. 洛谷P1850 [noip2016]换教室——期望DP

    题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...

  8. softmax function in c++

    #include <iostream> #include <vector> #include <cmath> #include <algorithm> ...

  9. centOS命令随笔记(杂):cd、pwd

    1.向上向下翻页: 反向的命令一般是Shift-PageUp和Shift-PageDown. 每日一命令:cd 1.cd /   进入系统根目录 2.cd ..   进入系统根目录可以使用“ cd . ...

  10. 微信小程序-wepy-组件模板重复渲染

    微信小程序开发,有使用wepy框架的需求.上手: 安装自己可以到官网查看,飞机票:https://tencent.github.io/wepy/document.html#/ 具体开发模式和Vue开发 ...