• 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

  • 相关阅读:
    神经网络
    机器学习英语
    机器学习常用函数解析
    机器学习(二)
    机器学习(三)
    Python文本数据分析与处理
    数据分析
    sklearn
    「Poetize9」升降梯口
    「Poetize9」礼物运送
  • 原文地址:https://www.cnblogs.com/Code-life/p/7103697.html
Copyright © 2020-2023  润新知