苹果告诉我们这样分析crash

如何查看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是在执行暂停时执行的功能。 第一帧是调用第零帧的函数,依此类推。

堆栈帧的执行函数所在的二进制文件的名称。

对于第零帧,执行暂停时正在执行的机器指令的地址。 对于剩余的堆栈帧,当控制权返回到堆栈帧时,将执行的机器指令的地址。

在符号化的崩溃报告中,堆栈框架中的函数的方法名称。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349