码迷,mamicode.com
首页 > 移动开发 > 详细

Swift app中的Crash捕获与处理

时间:2017-07-01 23:23:36      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:无法   backtrace   ace   hub   cal   系统   rac   call   信息   

1. 为什么会Crash

常见的Crash原因有:访问已经被释放的内存,数组越界,使用!解包值为nil的变量。当遇到这些情况时,说明应用已经遇到了很严重的非预期错误,无法再继续运行。操作系统检测到这些非法操作时会向应用发送对应的信号,而应用对这些信号的默认处理是直接让应用退出(已信号值作为退出码)。这样就出现了我们看到的Crash,闪退。

具体的信号种类和信号机制见Unix Signal

2. 如何捕获和处理Crash

在swift3.0中,我们可以通过如下调用来注册对特定信号的处理逻辑。

signal(SIGINT, {s in print(s);})

在处理函数中我们一般做如下操作:

  • 获取调用栈信息
  • 相关逻辑处理(比如保存调用栈到文件或数据库)
  • 恢复信号处理函数到默认设置
  • 调用exit退出应用

3. 获取调用栈信息

分析Crash最有价值的信息就是调用栈。在Swift 3.0中我们可以调用Thread.callStackSymbols来获取Crash的调用栈信息。(以前是通过backtrace和backtrace_symbols系统调用来获取)

需要说明的是Thread.callStackSymbols返回的调用栈也包含了从crash触发代码到调用Thread.callStackSymbols之间的调用栈信息,可根据需要选择是否去除。

基于以上技术点,我分别基于OC和Swift实现了两套CrashHandler,以及示例程序。代码见:https://github.com/lbwxly/CrashHandler

Swift app中的Crash捕获与处理

标签:无法   backtrace   ace   hub   cal   系统   rac   call   信息   

原文地址:http://www.cnblogs.com/Code-life/p/7103697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!