如何查看crash日志
头部信息
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
Incident Identifier报告的唯一标识符。 两份报告决不会共享同一个事件标识符
CrashReporter Key匿名的每个设备标识符。 来自同一设备的两个报告将包含相同的值。
Beta Identifier崩溃的应用程序的设备和供应商的组合的唯一标识符。 两个来自同一供应商和同一设备的应用程序报告将包含相同的值。 该字段仅出现在为通过TestFlight分发的应用程序生成的崩溃报告中,并替换CrashReporter Key字段。
Process崩溃的进程的可执行文件名称。 这与应用程序的信息属性列表中的CFBundleExecutable键的值相匹配。
Version崩溃的进程的版本。 该字段的值是崩溃的应用程序的CFBundleVersion和CFBundleVersionString的串联。
Code Type:崩溃过程的目标体系结构。 这将是ARM-64,ARM,x86-64或x86之一。
Role:终止时分配给进程的task_role。
OS Version操作系统版本,包括发生崩溃的内部版本号
异常信息
不要与Objective-C / C ++异常混淆(尽管其中之一可能是崩溃的原因),本节列出了Mach异常类型以及提供关于崩溃性质信息的相关字段。 并非所有的字段都会出现在每个崩溃报告中
以下是几种情况
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0
1 由于未被捕获的Objective-C异常而终止进程时生成的崩溃报告中异常代码部分的摘录。
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
2 当一个进程被终止,因为它解除了一个空指针的引用而生成的崩溃报告中的异常代码部分的摘录
以下介绍此种情况中可能出现的字段的解释。
Exception Codes有关异常的处理器特定信息编码成一个或多个64位十六进制数字。 通常情况下,这个字段不会出现,因为Crash Reporter解析异常代码,将它们作为其他字段中的人类可读描述。
Exception Subtype异常代码的可读名称
Exception Message从异常代码中提取的其他可读信息。
Exception Note:其他信息不是特定于一种例外类型。 如果这个字段包含SIMULATED(这不是崩溃),那么进程没有崩溃,但是在系统的请求下,通常是看门狗。
Termination Reason退出进程终止时指定的原因信息。 进程内外的关键系统组件将在遇到致命错误(例如,错误的代码签名,缺少的相关库或访问隐私敏感信息而没有正确授权)时终止进程。 macOS Sierra,iOS 10,watchOS 3和tvOS 10都采用了新的基础架构来记录这些错误,这些操作系统生成的崩溃报告列出了“终止原因”字段中的错误消息。
Triggered by Thread /crash Thread发生异常的线程
以下部分解释了一些最常见的异常类型。
Bad Memory Access [EXC_BAD_ACCESS // SIGSEGV // SIGBUS]
该进程尝试访问无效的内存,或试图以内存保护级别不允许的方式访问内存(例如,写入只读内存)。 异常子类型字段包含描述错误的kern_return_t和不正确访问的内存的地址。
这里有一些关于调试坏内存访问崩溃的提示:
1 如果objc_msgSend或objc_release靠近崩溃线程的Backtraces顶部,则进程可能试图向释放的对象发送消息。 你应该使用Zombies instrument来分析应用程序,以便更好地理解这次崩溃的情况。
2 如果gpus_ReturnNotPermittedKillClient接近崩溃线程的Backtraces顶部,则该进程被终止,因为它试图在后台使用OpenGL ES或Metal进行渲染。 请参阅QA1766:QA1766: How to fix OpenGL ES application crashes when moving to the background
3 在启用Address Sanitizer的情况下运行您的应用程序。 地址清理程序在编译代码中的内存访问中添加额外的工具。 当你的应用程序运行时,如果内存以可能导致崩溃的方式被访问,Xcode会提醒你。 (不理解)
[EXC_CRASH // SIGABRT]
该过程异常退出。 这种异常类型崩溃的最常见原因是未被捕获的Objective-C / C ++异常和对abort()的调用。
如果App Extensions需要花费太多时间来初始化(看门狗终止a watchdog termination),那么App Extensions将终止于此异常类型。 如果扩展在启动时因挂起而死亡,则生成的崩溃报告的Exception Subtype将为LAUNCH_HANG。 由于扩展没有主函数,任何花在初始化上的时间都出现在扩展库和相关库中的静态构造函数和+load方法中。 你应该尽可能地推迟这项工作。
Trace Trap [EXC_BREAKPOINT // SIGTRAP]跟踪陷阱
与异常退出相似,此异常旨在让附加的调试器在执行过程的特定时刻中断进程。 你可以使用__builtin_trap()函数从你自己的代码中触发这个异常。 如果没有附加调试器,则会终止该过程并生成崩溃报告。
较低级别的库(例如libdispatch)会在遇到致命错误时捕获进程。 有关该错误的其他信息可以在崩溃报告的“附加诊断信息”部分或设备的控制台中找到
具体的查看Backtraces (崩溃详细)以确定遇到意外情况的位置。 其他信息也可能已记录到设备的控制台。 您应该修改崩溃位置的代码以正常处理运行时故障。 例如,使用可选绑定而不是强制解包可选。
非法指令[EXC_BAD_INSTRUCTION // SIGILL]
该进程试图执行非法或未定义的指令。 该进程可能试图通过错误配置的函数指针跳转到无效地址。
在Intel处理器上,ud2操作码会导致EXC_BAD_INSTRUCTION异常,但通常用于捕获进程以进行调试。 如果在运行时遇到意外情况,英特尔处理器上的Swift代码将以此异常类型终止。 详情请参阅跟踪陷阱。
退出[SIGQUIT]
该进程在另一个具有管理其生命周期的进程的请求下被终止。 SIGQUIT并不意味着这个过程崩溃了,但它可能会以可检测的方式行事。
在iOS上,如果主机应用程序的加载时间过长,它将被退出。 崩溃报告中显示的Backtraces不可能指向负责任的代码。 最有可能的是,扩展启动路径上的其他一些代码需要很长时间才能完成,但是在时间限制之前完成,因此当扩展退出时,执行已经移到了Backtraces中显示的代码。 您应该对扩展进行概要分析,以便更好地理解启动过程中的大部分工作,并将该工作转移到后台线程或将其延迟至稍后(在加载扩展后)
Killed [SIGKILL]
该过程在系统的请求下被终止。查看终止原因字段以更好地了解终止的原因。
终止原因字段将包含一个名称空间,后跟一个代码。以下代码是特定于watchOS的。
终止代码0xc51bad01表示由于在执行后台任务时使用了太多的CPU时间,所以手表应用程序被终止。为了解决这个问题,优化执行后台任务的代码以获得更高的CPU效率,或者减少应用程序在后台运行时的工作量。
终止代码0xc51bad02表示由于在分配的时间内未能完成后台任务而终止了手表应用程序。要解决此问题,请减少在后台运行时应用程序执行的工作量。
终止代码0xc51bad03指示观看应用程序在分配的时间内未能完成后台任务,并且系统总体上足够忙,以至于应用程序可能没有接收到执行后台任务的CPU时间。尽管应用程序可以通过减少在后台任务中执行的工作量来避免此问题,但是0xc51bad03并不表示应用程序出错了。更可能的是,由于整体系统负载,应用程序无法完成其工作。
保护资源违规[EXC_GUARD]
这个过程违反了有保护的资源保护。 系统库可能会将某些文件描述符标记为被保护,之后对这些描述符的正常操作将触发EXC_GUARD异常(当它想操作这些文件描述符时,系统使用特殊的“保护”私有API)。 这可以帮助您快速追踪问题,如关闭由系统库打开的文件描述符。 例如,如果一个应用程序关闭了用于访问支持Core Data存储的SQLite文件的文件描述符,那么核心数据将在稍后神秘地崩溃。 守护异常很快就会注意到这些问题,从而使它们更易于调试。
资源限制[EXC_RESOURCE]
该过程超出了资源消耗限制。这是来自操作系统的通知,该进程正在使用太多的资源。确切的资源列在“例外子类型”字段中。如果异常注释字段包含非致命条件,则即使生成崩溃报告,该过程也不会被终止。
MEMORY异常表示该进程已超过系统强加的内存限制。这可能是终止过量内存使用的先兆。
异常子类型WAKEUPS表示进程中的线程每秒被唤醒的次数太多,这迫使CPU醒来的频率很高,消耗电池寿命。
通常,这是由线程间通信(通常使用peformSelector:onThread:或dispatch_async)导致的,这些通信不知不觉地发生得比应该更频繁。因为触发这种异常的通信发生的频率非常频繁,所以通常会有多个具有非常相似的Backtraces的后台线程 - 指示通信起源的位置。
其他异常类型
某些崩溃报告可能包含一个未命名的“例外类型”,将以十六进制值打印(例如00000020)。 如果您收到这些崩溃报告之一,请直接查看“例外代码”字段以获取更多信息。
异常代码0xbaaaaaad表示日志是整个系统的堆栈快照,而不是崩溃报告。 要拍摄堆叠照片,请按主页按钮和任何音量按钮。 通常这些日志是由用户偶然创建的,并不表示错误。
异常代码0xbad22222表示一个VoIP应用程序已被iOS终止,因为它恢复得太频繁。
异常代码0x8badf00d表示应用程序已被iOS终止,因为发生了看门狗超时。 应用程序花了太长时间才能启动,终止或响应系统事件。 一个常见的原因是在主线程上进行同步联网。 无论什么操作,线程0都需要移动到后台线程,或者以不同的方式进行处理,这样就不会阻塞主线程。
异常代码0xc00010ff表示该应用程序因响应热事件而被操作系统杀死。 这可能是由于发生此次崩溃的特定设备或其所在的环境所引起的问题。有关使您的应用程序更有效地运行的提示,请参阅iOS Performance and Power Optimization with Instruments。
异常代码0xdead10cc表示应用程序已被操作系统终止,因为它在挂起期间持有文件锁或sqlite数据库锁。 如果您的应用程序在挂起时对锁定文件或sqlite数据库执行操作,则必须请求额外的后台执行时间才能完成这些操作,并在挂起之前放弃锁定。
ps 通过从多任务托盘中(双击home)删除应用程序来终止暂停的应用程序不会生成崩溃报告。 一旦应用程序暂停,它随时可以由iOS终止,因此不会生成崩溃报告。
其他诊断信息
Application Specific Information:在进程终止之前捕获的framework错误消息
Kernel Messages:内核信息 代码签名问题的详细信息
Dyld Error Messages:错误消息由动态链接器发出
当一个流程因为链接的框架而被终止时,生成的崩溃报告中“应用程序特定信息”部分的摘录无法找到。
比如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
Backtraces回溯
崩溃报告中最有用的部分是每个进程线程在其终止时的回溯。 这些跟踪中的每一个与您在使用调试器暂停过程时所看到的类似
如
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 TheElements 0x000000010006bc20 -[AtomicElementViewController myTransitionDidStop:finished:context:] (AtomicElementViewController.m:203)
1 UIKit 0x0000000194cef0f0 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 312
2 UIKit 0x0000000194ceef30 -[UIViewAnimationState animationDidStop:finished:] + 160
3 QuartzCore 0x0000000192178404 CA::Layer::run_animation_callbacks(void*) + 260
4 libdispatch.dylib 0x000000018dd6d1c0 _dispatch_client_callout + 16
5 libdispatch.dylib 0x000000018dd71d6c _dispatch_main_queue_callback_4CF + 1000
6 CoreFoundation 0x000000018ee91f2c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
7 CoreFoundation 0x000000018ee8fb18 __CFRunLoopRun + 1660
8 CoreFoundation 0x000000018edbe048 CFRunLoopRunSpecific + 444
9 GraphicsServices 0x000000019083f198 GSEventRunModal + 180
10 UIKit 0x0000000194d21bd0 -[UIApplication _run] + 684
11 UIKit 0x0000000194d1c908 UIApplicationMain + 208
12 TheElements 0x00000001000653c0 main (main.m:55)
13 libdyld.dylib 0x000000018dda05b8 start + 4
第一行列出当前正在执行的调度队列的线程号和标识符 剩下的就是堆栈信息了 从左到右依次为
堆栈帧号。 堆栈框架以调用顺序呈现,其中框架0是在执行暂停时执行的功能。 第一帧是调用第零帧的函数,依此类推。
堆栈帧的执行函数所在的二进制文件的名称。
对于第零帧,执行暂停时正在执行的机器指令的地址。 对于剩余的堆栈帧,当控制权返回到堆栈帧时,将执行的机器指令的地址。
在符号化的崩溃报告中,堆栈框架中的函数的方法名称。