上一篇文章我们讲述了,被系统自带的错误处理捕获的崩溃,可以通过UncaughtExceptionHandler机制捕获崩溃信息,我们要做的就是用自定义函数代替该ExceptionHandler即可。
另一种是未被捕获的异常,导致程序向自身发送了SIGABRT信号而崩溃。如果要处理它,我们还要利用unix标准的signal机制,注册SIGABRT,SIGBUS,SIGSEGV等信号发生时的处理函数。该函数中我们可以输出栈信息,版本信息等其他一切我们所想要的。这篇文章,我们将分析如何收集此类异常。
自定义一个customSignalExceptionHandler类,在.h文件中定义一个类方法:

在.m文件中实现:

这样我们就实现好了一个自定义SignalExceptionHandler类,并将signal异常崩溃堆栈保存成本地文件。
这里最关键的一步,SignalHandler不要在debug环境下测试。因为系统的debug会优先去拦截。我们要运行一次后,关闭debug状态,直接在模拟器上点击我们build上去的app运行,而caughtExceptionHandler可以在调试状态下捕捉。完成这一系列操作后,在沙盒里可以查看到保存的SignalException.txt文件。以此追溯程序崩溃前的函数调用堆栈,进行准确debug。

iOS的crash捕获分两种情况,有OC类异常和Signal信号捕获。
OC类异常,可以先通过NSGetUncaughtExceptionHandler保存先前注册的异常处理器,然后通过NSSetUncaughtExceptionHandler设置我们自己的异常处理器。处理结束后,需要在设置会原来的异常处理器。在我们自己的customUncaughtExceptionHandler里,需要手动调用下原来的处理器。
Signal信号捕获,Signal信号是由iOS底层mach信号异常转换后,以signal信号抛出的异常。既然是兼容posix标准的异常,我们可以用sigaction函数注册对应的信号。
这里,我们就知道了在iOS里如何使用代码进行crash的捕获。
因为xcode支持崩溃日志自动符号化,前提是本地有当时build/archive生成的dsym文件。我们在xcode上运行,崩溃日志已经自动符号化了。但如果dsym文件丢失或者拿到的崩溃日志不是标准的crash log,如何定位crash呢。
在后面的系列篇章中我会详细介绍符号化的过程,敬请期待!
欲了解更多详情,请参见:
华为官网:
https://developer.huawei.com/consumer/cn/forum/topic/0203721046139040273?fid=0101271690375130218?ha_source=zzh