崩溃

作者: 冰雨9527 | 来源:发表于2021-08-14 19:50 被阅读0次

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


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

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

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

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

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

    • 0x8badf00d,表示 App 在一定时间内无响应而被 watchdog 杀掉的情况。
    • 0xdeadfa11,表示 App 被用户强制退出。
    • 0xc00010ff,表示 App 因为运行造成设备温度太高而被杀掉。

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

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

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

    相关文章

      网友评论

          本文标题:崩溃

          本文链接:https://www.haomeiwen.com/subject/ssqlbltx.html