iOS开发-常见的崩溃信息

崩溃信息构成

常见的崩溃日志的头部信息如下:

Incident Identifier: B6FD1E8E-B39F-430B-ADDE-FC3A45ED368C
CrashReporter Key: f04e68ec62d3c66057628c9ba9839e30d55937dc
Hardware Model: iPad6,8
Process: TheElements [303]
Path: /private/var/containers/Bundle/Application/888C1FA2-3666-4AE2-9E8E-62E2F787DEC1/TheElements.app/TheElements
Identifier: com.example.apple-samplecode.TheElements
Version: 1.12
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: com.example.apple-samplecode.TheElements [402]
 
Date/Time: 2016-08-22 10:43:07.5806 -0700
Launch Time: 2016-08-22 10:43:01.0293 -0700
OS Version: iPhone OS 10.0 (14A5345a)
Report Version: 104

这些参数说明可以查看 官方文档 Analyzing Crash Reports

Exception信息

  • 一个进程因未捕获的Objective-C异常而终止时生成的崩溃报告。
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0

  • 一个空指针崩溃
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
Triggered by Thread: 0

常见的崩溃问题

  • 坏内存访问 [EXC_BAD_ACCESS // SIGSEGV // SIGBUS]

    当崩溃堆栈顶部是objc_msgSend或者objc_release这样的,一般都是对已经释放的对象发送消息。可以开启僵尸模式Zombies instrument来调试这种bug
    gpus_ReturnNotPermittedKillClient在堆栈顶部,一般都是app尝试在后台使用 OpenGL ES or Metal渲染,可以见 QA1766: How to fix OpenGL ES application crashes when moving to the background

  • 异常退出[EXC_CRASH // SIGABRT]
    这种异常类型的崩溃最常见的原因是未捕获的Objective-C/ c++异常和对abort()的调用。
    如果应用程序扩展 Extension启动所需时间过久(例如被看门狗 Watch Dog终止),则将使用此异常类型终止应用程序扩展。如果一个扩展在启动时由于挂起而终止,那么生成的崩溃报告的异常子类型将是LAUNCH_HANG。因为扩展没有主函数,所以花在初始化上的任何时间都是在静态构造函数和扩展库中的+load方法中进行的。你应该尽可能多地推迟这项工作。
    看门狗Watch Dog的崩溃异常代码通常是“0x8badf00d”,即“ate bad food”

  • 跟踪陷阱 [EXC_BREAKPOINT // SIGTRAP]
    与异常退出类似,此异常旨在使附加的调试器有机会在进程执行的特定位置中断进程。您可以使用_builtin_trap()函数从您自己的代码中触发此异常。如果没有附加调试器,则终止进程并生成崩溃报告。

    例如[NSException raise:@"Bad" format:@"Test"];触发的类型就是SIGABRT

  • 非法指令 [EXC_BAD_INSTRUCTION // SIGILL]
    进程试图执行非法或未定义的指令。进程可能试图通过错误配置的函数指针跳转到无效地址。

    在Intel处理器上,ud2操作码会导致EXC_BAD_INSTRUCTION异常,但通常用于捕获进程以进行调试。如果在运行时遇到意外情况,Intel处理器上的Swift代码将使用此异常类型终止。有关详细信息,请参见跟踪陷阱。

  • 强制退出 [SIGQUIT]
    例如键盘扩展应用(Extension)加载时间过长,会被主程序(Main App)退出。

  • 被杀死[SIGKILL]
    在系统的请求下,进程被终止。查看终止原因字段以更好地理解终止的原因。

    终止原因字段将包含后跟代码的名称空间。以下代码是针对watchOS的:

    终止码0xc51bad01表示一个监视应用程序被终止了,因为它在执行后台任务时占用了太多的CPU时间。要解决这个问题,可以优化执行后台任务的代码以提高CPU效率,或者减少在后台运行应用程序时执行的工作量。
    终止代码0xc51bad02表示一个监视应用程序被终止,因为它未能在分配的时间内完成一个后台任务。要解决这个问题,减少应用程序在后台运行时执行的工作量。
    终止码0xc51bad03表示一个监视应用程序未能在分配的时间内完成一个后台任务,并且系统总体上非常繁忙,应用程序可能没有收到足够多的CPU时间来执行后台任务。虽然一个应用程序可以通过减少它在后台任务中执行的工作量来避免这个问题,但是0xc51bad03并不表示这个应用程序做错了什么。更有可能的是,由于整个系统的负载,该应用程序无法完成其工作。

  • 被保护的资源冲突 [EXC_GUARD]
    该过程违反了受保护的资源保护。系统库可能将某些文件描述符标记为保护的,在此之后,对这些描述符的正常操作将触发EXC_GUARD异常(当系统希望对这些文件描述符进行操作时,系统使用特殊的“保护的”私有api)。这有助于快速跟踪问题,比如关闭系统库打开的文件描述符。例如,如果应用程序关闭用于访问支持Core Data存储的SQLite文件文件描述符Core Data将在很久以后神秘地崩溃。guard异常可以更快地发现这些问题,从而使它们更容易调试。

    查看文档

  • 资源限制 [EXC_RESOURCE]
    该流程超出了资源消耗限制。这是来自操作系统的通知,该进程使用了太多的资源。确切的资源在Exception Subtype字段中列出。如果Exception Note字段包含非致命条件,则即使生成了崩溃报告,进程也不会被终止。

    Exception SubtypeMEMORY表示进程已经超过了系统施加的内存限制。这可能是终止过多内存使用的前兆。
    Exception SubtypeWAKEUPS表明进程中的线程每秒被唤醒太多次,这迫使CPU频繁地唤醒,消耗电池寿命。
    通常,这是由线程之间的通信(通常使用peformSelector:onThread:dispatch_async)造成的,这种通信在不知情的情况下发生的频率远远超出了预期。由于触发此异常的通信类型非常频繁,因此通常会有多个具有非常类似回溯的后台线程——指示通信来自何处。

  • 其他异常类型
    一些崩溃报告可能包含一个未命名的Exception Type,它将被打印为十六进制值(例如00000020)。如果您收到其中一个崩溃报告,请直接查看Exception Codes字段以获取更多信息。

    Exception Codes0xbaaaaaad表明日志是整个系统的堆栈,而不是崩溃报告。要拍摄堆叠,请同时按侧键和两个音量键。这些日志通常是用户偶然创建的,它们并不表示错误。
    Exception Codes0xbad22222表示一个VoIP应用程序已经被iOS终止了,因为它恢复得太频繁了。
    Exception Codes0x8badf00d表示,由于发生了看门狗超时,iOS已经终止了应用程序。应用程序启动、终止或响应系统事件花费了太长时间。一个常见的原因是在主线程上执行同步网络线程0(Main)上的任何操作都需要移动到后台线程,或者以不同的方式处理,这样它就不会阻塞主线程。
    Exception Codes0xc00010ff表示应用程序在响应热事件( thermal event.)时被操作系统杀死。这可能是由于发生崩溃的特定设备或操作它的环境出现了问题。有关如何让你的应用程序运行得更有效率的技巧,请参阅 iOS Performance and Power Optimization with Instruments
    Exception Codes0xdead10cc表示一个应用程序已经被OS终止,因为它在挂起期间持有一个文件锁sqlite数据库锁。如果您的应用程序在挂起时对一个锁定的文件sqlite数据库执行操作,那么它必须请求额外的后台执行时间来完成这些操作,并在挂起之前释放锁。
    Exception Codes0x2bad45ec表明,由于安全冲突,iOS已经终止了一个应用程序。终止描述“Process detected doing insecure drawing while in secure mode”,表示应用程序试图在不允许的情况下(比如在屏幕锁定的情况下)向屏幕绘图。用户可能没有注意到这个终止,因为当这个终止发生时,屏幕是关闭的或锁屏显示的。

使用应用程序切换器 app switcher(Home键出现的切换界面) 终止挂起的应用程序不会生成崩溃报告。一旦应用程序被挂起,它可以在任何时候被iOS终止,所以不会产生崩溃报告。

额外的诊断信息

本节包括特定于终止类型的额外诊断信息,其中可能包括:

特定应用程序的信息 Application Specific Information:在进程终止之前捕获的框架错误消息
内核消息 Kernel Messages:关于代码签名问题的详细信息
Dyld错误消息 Dyld Error Messages :动态链接器发出的错误消息
macOS Sierra、iOS 10、watchOS 3和tvOS 10开始,大多数信息现在都报告在异常信息 Exception Information下的Termination Reason字段中。

  • 进程因链接到的框架无法找到而终止时生成的崩溃报告。
Dyld Error Message:
Dyld Message: Library not loaded: @rpath/MyCustomFramework.framework/MyCustomFramework
  Referenced from: /private/var/containers/Bundle/Application/CD9DB546-A449-41A4-A08B-87E57EE11354/TheElements.app/TheElements
  Reason: no suitable image found.

  • 摘自进程因未能快速加载其初始视图控制器而终止时生成的崩溃报告。
Application Specific Information:
com.example.apple-samplecode.TheElements failed to scene-create after 19.81s (launch took 0.19s of total time limit 20.00s)
 
Elapsed total CPU time (seconds): 7.690 (user 7.690, system 0.000), 19% CPU
Elapsed application CPU time (seconds): 0.697, 2% CPU

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章