智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述Swift app中的Crash捕获与处理相关的知识,希望能为你提供帮助。
1. 为什么会Crash
常见的Crash原因有:访问已经被释放的内存,数组越界,使用!解包值为nil的变量。当遇到这些情况时,说明应用已经遇到了很严重的非预期错误,无法再继续运行。操作系统检测到这些非法操作时会向应用发送对应的信号,而应用对这些信号的默认处理是直接让应用退出(已信号值作为退出码)。这样就出现了我们看到的Crash,闪退。
具体的信号种类和信号机制见Unix Signal
【Swift app中的Crash捕获与处理】2. 如何捕获和处理Crash
在swift3.0中,我们可以通过如下调用来注册对特定信号的处理逻辑。
signal(SIGINT, {s in print(s); })
在处理函数中我们一般做如下操作:
- 获取调用栈信息
- 相关逻辑处理(比如保存调用栈到文件或数据库)
- 恢复信号处理函数到默认设置
- 调用exit退出应用
分析Crash最有价值的信息就是调用栈。在Swift 3.0中我们可以调用Thread.callStackSymbols来获取Crash的调用栈信息。(以前是通过backtrace和backtrace_symbols系统调用来获取)
需要说明的是Thread.callStackSymbols返回的调用栈也包含了从crash触发代码到调用Thread.callStackSymbols之间的调用栈信息,可根据需要选择是否去除。
基于以上技术点,我分别基于OC和Swift实现了两套CrashHandler,以及示例程序。代码见:https://github.com/lbwxly/CrashHandler
推荐阅读
- Android Okhttp完美同步持久Cookie实现免登录
- Android 封装实现各种样式对话框
- Android之QQ授权登录获取用户信息
- Android提示版本号更新操作流程
- Android和iOS的10个最佳GPS车速表应用合集 [免费和付费]
- 10款Android的最佳数据保存应用合集(节省数据和金钱)
- 适用于大中小型企业的最佳数据库软件合集
- Windows的最佳DVD刻录软件合集(MagicDisc的替代品)
- Windows的10款最佳旅行社软件合集(哪个更好用())