转载

iOS Swift Crash的捕获

介绍

  • 如果对crash捕获不太了解,可以先参考这篇文章,本文进行Mach异常+Unix信号方式捕获crash。

  • NSException一般只在OC当中被捕获,一般情况下在捕获NSException异常后同时也会捕获到一个对应的signal异常。但如果你使用的是纯swift开发,如下代码并不会捕获相关的crash

  NSSetUncaughtExceptionHandler(UncaughtExceptionHandler)

swift崩溃捕获

  • swift通常都是通过对应的signal来捕获crash。对于swift的崩溃捕获,Apple的文档中有描述说需要通过SIGTRAP信号捕获强转失败,及非可选的nil值导致的崩溃.具体描述如下:

Trace Trap[EXC_BREAKPOINT // SIGTRAP]
  类似于异常退出,此异常旨在使附加的调试器有机会在其执行中的特定点中断进程。您可以使用该__builtin_trap()函数从您自己的代码触发此异常。如果没有附加调试器,则该过程将终止并生成崩溃报告。
  较低级的库(例如,libdispatch)会在遇到致命错误时捕获进程。有关错误的其他信息可以在崩溃报告的“ 附加诊断信息”部分或设备的控制台中找到。
  如果在运行时遇到意外情况,Swift代码将以此异常类型终止,例如:
      1.具有nil值的非可选类型
      2.一个失败的强制类型转换
  • 对于swift还有一种崩溃需要捕获(Intel处理器,我认为应该是指在模拟器上的崩溃),为保险起见,也需要将信号SIGILL进行注册,Apple同样对其中做了描述

  Illegal Instruction[EXC_BAD_INSTRUCTION // SIGILL]
  该过程尝试执行非法或未定义的指令。该过程可能尝试通过错误配置的函数指针跳转到无效地址。
  在Intel处理器上,ud2操作码引起EXC_BAD_INSTRUCTION异常,但通常用于进程调试目的。如果在运行时遇到意外情况,Intel处理器上的Swift代码将以此异常类型终止。有关详细信息,请参阅Trace Trap。

最终实现代码参考

    //对于OC的exception采取如下方式捕获
    NSSetUncaughtExceptionHandler(UncaughtExceptionHandler)
    //对于Swift则捕获相关signa,一般来说如下几种已经能够捕获大部分crash。(其中SIGTRAP一定要捕获,swift大量的crash都会通过它)
     signal(SIGABRT, SignalExceptionHandler)
    signal(SIGSEGV, SignalExceptionHandler)
    signal(SIGBUS, SignalExceptionHandler)
    signal(SIGTRAP, SignalExceptionHandler)
    signal(SIGILL, SignalExceptionHandler)

这是一个Demo,如果对你有帮助,给个star呗。
参考文档连接

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

正文到此结束
Loading...