博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS Crash收集框架
阅读量:6347 次
发布时间:2019-06-22

本文共 1033 字,大约阅读时间需要 3 分钟。

  hot3.png

为了能够第一时间发现程序问题,应用程序需要实现自己的崩溃日志收集服务,成熟的开源项目很多,如 等。追求方便省心,对于保密性要求不高的程序来说,也可以选择各种一条龙Crash统计产品,如  , 等等。

iOS系统自带的 Apple’s Crash Reporter 记录在设备中的Crash日志,Exception Type项通常会包含两个元素: Mach异常 和 Unix信号。

Exception Type:         EXC_BAD_ACCESS (SIGSEGV) Exception Subtype:      KERN_INVALID_ADDRESS at 0x041a6f3

Mach异常是什么?它又是如何与Unix信号建立联系的?

Mach是一个XNU的微内核核心,Mach异常是指最底层的内核级异常,被定义在下 。每个thread,task,host都有一个异常端口数组,Mach的部分API暴露给了用户态,用户态的开发者可以直接通过Mach API设置thread,task,host的异常端口,来捕获Mach异常,抓取Crash事件。

所有Mach异常都在host层被ux_exception转换为相应的Unix信号,并通过threadsignal将信号投递到出错的线程。iOS中的 POSIX API 就是通过 Mach 之上的 BSD 层实现的。

因此,EXC_BAD_ACCESS (SIGSEGV)表示的意思是:Mach层的EXC_BAD_ACCESS异常,在host层被转换成SIGSEGV信号投递到出错的线程。既然最终以信号的方式投递到出错的线程,那么就可以通过注册signalHandler来捕获信号:

signal(SIGSEGV,signalHandler);

捕获Mach异常或者Unix信号都可以抓到crash事件,这两种方式哪个更好呢? 

优选Mach异常,因为Mach异常处理会先于Unix信号处理发生,如果Mach异常的handler让程序exit了,那么Unix信号就永远不会到达这个进程了。转换Unix信号是为了兼容更为流行的POSIX标准(SUS规范),这样不必了解Mach内核也可以通过Unix信号的方式来兼容开发。

正如上述所说,可以通过捕获Mach异常、或Unix信号两种方式来抓取crash事件,如:

100950_RPnJ_181841.png

转载于:https://my.oschina.net/qiukun/blog/472775

你可能感兴趣的文章
RHEL系列网络配置2015083101
查看>>
c# 基本值类型及其默认值
查看>>
[设计模式]简单工厂模式
查看>>
Python正则表达式指南
查看>>
服务器端解决JS跨域调用问题
查看>>
Cocos2d-x游戏开发Lua
查看>>
迁移至个人blog
查看>>
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
查看>>
雨巷-戴望舒
查看>>
OpenCms创建网站过程图解——献给OpenCms的初学者们
查看>>
C++ 异常处理机制的实现
查看>>
Freebsd的ports命令
查看>>
分布式系统---幂等性设计
查看>>
get与post请求简单理解
查看>>
Android: Android Studio签名打包的两种方式(zz)
查看>>
组件接口(API)设计指南[2]-类接口(class interface)
查看>>
【转】时钟周期,机器周期,指令周期的区别
查看>>
MYSQL 更新时间自己主动同步与创建时间默认值共存问题
查看>>
android 屏幕适配
查看>>
Android Activity的4种启动模式
查看>>