介绍
如果对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呗。
参考文档连接
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。