Swift app中的Crash捕获与处理

Posted CodeLife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift app中的Crash捕获与处理相关的知识,希望对你有一定的参考价值。

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捕获与处理的主要内容,如果未能解决你的问题,请参考以下文章

iOS异常信号的捕获和简单处理

以 NSException Timer Swift Crash 类型的未捕获异常终止

App Crash崩溃捕获

Android中使用UncaughtExceptionHandler来处理未捕获的异常

为啥使用Try,Catch捕获异常,程序依然Crash

Swift 使用NSSetUncaughtExceptionHandler 实现异常捕获及日志上传和app 起死回生