崩溃信息构成
常见的崩溃日志的头部信息
如下:
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 Subtype
是MEMORY
表示进程已经超过了系统施加的内存限制。这可能是终止过多内存使用的前兆。
Exception Subtype
是WAKEUPS
表明进程中的线程每秒被唤醒太多次,这迫使CPU频繁地唤醒,消耗电池寿命。
通常,这是由线程之间的通信(通常使用peformSelector:onThread:
或dispatch_async
)造成的,这种通信在不知情的情况下发生的频率远远超出了预期。由于触发此异常的通信类型非常频繁,因此通常会有多个具有非常类似回溯的后台线程——指示通信来自何处。 -
其他异常类型
一些崩溃报告可能包含一个未命名的Exception Type
,它将被打印为十六进制值(例如00000020
)。如果您收到其中一个崩溃报告,请直接查看Exception Codes
字段以获取更多信息。Exception Codes
为0xbaaaaaad
表明日志是整个系统的堆栈,而不是崩溃报告。要拍摄堆叠,请同时按侧键和两个音量键。这些日志通常是用户偶然创建的,它们并不表示错误。
Exception Codes
为0xbad22222
表示一个VoIP应用程序
已经被iOS终止了,因为它恢复得太频繁了。
Exception Codes
为0x8badf00d
表示,由于发生了看门狗超时,iOS已经终止了应用程序。应用程序启动、终止或响应系统事件花费了太长时间。一个常见的原因是在主线程上执行同步网络
。线程0(Main)
上的任何操作都需要移动到后台线程,或者以不同的方式处理,这样它就不会阻塞主线程。
Exception Codes
为0xc00010ff
表示应用程序在响应热事件( thermal event.)
时被操作系统杀死。这可能是由于发生崩溃的特定设备或操作它的环境出现了问题。有关如何让你的应用程序运行得更有效率的技巧,请参阅 iOS Performance and Power Optimization with Instruments 。
Exception Codes
为0xdead10cc
表示一个应用程序已经被OS
终止,因为它在挂起期间持有一个文件锁
或sqlite数据库锁
。如果您的应用程序在挂起时对一个锁定的文件
或sqlite数据库
执行操作,那么它必须请求额外的后台执行时间来完成这些操作,并在挂起之前释放锁。
Exception Codes
为0x2bad45ec
表明,由于安全冲突,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