• 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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    最近碰到的一些问题
    CF #365 703D. Mishka and Interesting sum
    CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)
    Mac Hadoop的安装与配置
    pyenv的安装和使用
    tmux简要介绍
    将本地的项目通过SVN还原到某一版本,并将SVN服务器上的项目也还原到这一版本
    Tomcat7解决中文乱码
    解决tomcat7控制台中文乱码问题
    JDK环境变量配置,实现多个版本的JDK环境变量任意切换配置(Windows7 / Windows10 )
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7978623.html
Copyright © 2020-2023  润新知