崩溃

2021-08-14  本文已影响0人  冰雨9527

通过这张图片,我们可以看到, KVO 问题、NSNotification 线程问题、数组越界、野指针等崩溃信息,是可以通过信号捕获的。但是,像后台任务超时、内存被打爆、主线程卡顿超阈值等信息,是无法通过信号捕捉到的。


我们采集到的崩溃日志,主要包含的信息为:进程信息、基本信息、异常信息、线程回溯。

进程信息:崩溃进程的相关信息,比如崩溃报告唯一标识符、唯一键值、设备标识;
基本信息:崩溃发生的日期、iOS 版本;
异常信息:异常类型、异常编码、异常的线程;
线程回溯:崩溃时的方法调用栈。
通常情况下,我们分析崩溃日志时最先看的是异常信息,分析出问题的是哪个线程,在线程回溯里找到那个线程;然后,分析方法调用栈,符号化后的方法调用栈可以完整地看到方法调用的过程,从而知道问题发生在哪个方法的调用上。

其中,方法调用栈如下图所示:

方法调用栈顶,就是最后导致崩溃的方法调用。完整的崩溃日志里,除了线程方法调用栈还有异常编码。异常编码,就在异常信息里。

一些被系统杀掉的情况,我们可以通过异常编码来分析。你可以在维基百科上,查看完整的异常编码。这里列出了 44 种异常编码,但常见的就是如下三种:

0x8badf00d 这种情况是出现最多的。当出现被 watchdog 杀掉的情况时,我们就可以把范围控制在主线程被卡的情况。我会在第 13 篇文章“如何利用 RunLoop 原理去监控卡顿?”中,和你详细说明如何去监控这种情况来防范和快速定位到问题。

0xdeadfa11 的情况,是用户的主动行为,我们不用太关注。

0xc00010ff 这种情况,就要对每个线程 CPU 进行针对性的检查和优化。我会在第 18 篇文章“怎么减少 App 的电量消耗?”中,和你详细说明。

上一篇下一篇

猜你喜欢

热点阅读