如何看懂iOS的Crash报告 如何看懂iOS的Crash报告

作者&投稿:吕亭 2024-09-19
如何看懂iOS的Crash报告

本文分析了一份标准的iOS应用程序的Crash报告,它通常由以下6个部分组成。

1. 报告头(Header)
报告头包含了应用程序以其运行环境的一些基本信息,下面是报告头的一个例子。


复制代码
Incident Identifier: E6EBC860-0222-4B82-BF7A-2B1C26BE1E85
CrashReporter Key: 6196484647b3431a9bc2833c19422539549f3dbe
Hardware Model: iPhone6,1
Process: TheElements [4637]
Path: /private/var/mobile/Containers/Bundle/Application/5A9E4FC2-D03B-4E19-9A91-104A0D0C1D44/TheElements.app/TheElements
Identifier: com.example.apple-samplecode.TheElements
Version: 1.12
Code Type: ARM (Native)
Parent Process: launchd [1]


Date/Time: 2015-04-06 09:14:08.775 -0700
Launch Time: 2015-04-06 09:14:08.597 -0700
OS Version: iOS 8.1.3 (12B466)
Report Version: 105


2. 异常代码(Exception Codes)
异常代码可能包含异常类型(Exception Type)、异常子类型(Exception Subtype)、处理器的详细异常代码(processor-specific Exception Codes)和其它能提供更多Crash信息的字段,最后一个字段列出了触发Crash的线程索引。下面是异常代码的示例。


复制代码
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread: 0



常见的异常类型有以下几种。

a. Bad Memory Access [EXC_BAD_ACCESS // SIGSEGV // SIGBUS]
此类型的Excpetion是最常见的Crash,通常由访问了无效的内存导致。

SIGSEGV:访问了无效地址,没有物理内存对应该地址,通常由于重复释放对象导致。
SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGBUS 访问的是有效地址,但总线访问异常,通常是访问了未对齐的数据。
SEGV:代表无效内存地址,比如空指针、未初始化指针、栈溢出等。

b. Abnormal Exit [EXC_CRASH // SIGABRT]
进程异常退出,造成Crash通常是因为未捕获到Objective-C/C++的异常。

SIGABRT:收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。

c. 其它异常类型
有些异常类型没有被命名,以16进制数字表示。

0xbaaaaaad:意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态,由用户同时按Home键和音量键触发。
0xbad22222:当VoIP程序在后台太过频繁的激活时,系统可能会终止此类程序。
0x8badf00d:程序启动或者恢复时间过长被watch dog终止。
0xc00010ff:程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止。
0xdead10cc:程序退到后台时还占用系统资源(如通讯录)被系统终止。
0xdeadfa11:程序无响应用户强制退出。当用户长按电源键,直到屏幕出现关机确认画面后再长按Home键,将强制退出应用。我们可以合理认为用户这么做的原因是应用程序没有响应。

3. 应用详情(Application Specific Information)
有些Crash出现时,会产生额外的信息,这些信息能帮助用户更好地了解应用程序终止时的运行环境。示例如下。


复制代码
Application Specific Information:
MyApp[134] was suspended with locked system files:
/private/var/mobile/Library/AddressBook/AddressBook.sqlitedb


4. 回溯(Backtrace)
这部分列出了发生Crash时线程的调用栈。示例如下。


复制代码
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 TheElements 0x0000000100063fdc -[AtomicElementViewController myTransitionDidStop:finished:context:] (AtomicElementViewController.m:201)
1 UIKit 0x000000018ca5c2ec -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 184
2 UIKit 0x000000018ca5c1f4 -[UIViewAnimationState animationDidStop:finished:] + 100
3 QuartzCore 0x000000018c380f60 CA::Layer::run_animation_callbacks(void*) + 292
4 libdispatch.dylib 0x0000000198fb9368 _dispatch_client_callout + 12
5 libdispatch.dylib 0x0000000198fbd97c _dispatch_main_queue_callback_4CF + 928
6 CoreFoundation 0x000000018822dfa0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
7 CoreFoundation 0x000000018822c048 __CFRunLoopRun + 1488
8 CoreFoundation 0x00000001881590a0 CFRunLoopRunSpecific + 392
9 GraphicsServices 0x00000001912fb5a0 GSEventRunModal + 164
10 UIKit 0x000000018ca8aaa0 UIApplicationMain + 1484
11 TheElements 0x000000010005d800 main (main.m:55)
12 libdyld.dylib 0x0000000198fe2a04 start + 0


Thread 1 name: Dispatch queue: com.apple.libdispatch-manager
Thread 1:
0 libsystem_kernel.dylib 0x00000001990e0c94 kevent64 + 8
1 libdispatch.dylib 0x0000000198fc897c _dispatch_mgr_invoke + 272
2 libdispatch.dylib 0x0000000198fbb3b0 _dispatch_mgr_thread + 48


...


5. 线程状态(Thread State)
这部分列出了发生Crash的线程的状态,即寄存器和寄存器的值。示例如下。


复制代码
Thread 0 crashed with ARM Thread State (64-bit):
x0: 0x0000000000000000 x1: 0x0000000000000000 x2: 0x0000000000000000 x3: 0x00000001995f8020
x4: 0x0000000000000000 x5: 0x0000000000000001 x6: 0x0000000000000000 x7: 0x0000000000000000
x8: 0x0000000000000000 x9: 0x0000000000000015 x10: 0x0000000199601df0 x11: 0x0000000b0000000f
x12: 0x00000001741e8700 x13: 0x000001a5995f5779 x14: 0x0000000000000000 x15: 0x0000000044000000
x16: 0x00000001989724d8 x17: 0x0000000188176370 x18: 0x0000000000000000 x19: 0x00000001701dda60
x20: 0x0000000000000001 x21: 0x0000000136606e20 x22: 0x00000001000f6238 x23: 0x0000000000000000
x24: 0x000000019cc640a8 x25: 0x0000000000000020 x26: 0x0000000000000000 x27: 0x0000000000000000
x28: 0x000000019cc577c0 fp: 0x000000016fd1a8d0 lr: 0x00000001000effcc
sp: 0x000000016fd1a860 pc: 0x00000001000effdc cpsr: 0x60000000


6. 二进制映像(Binary Images)
这部分列出了当Crash发生时被装载进进程内存空间的依赖库或者模块。示例如下。

复制代码
Binary Images:
0x100058000 - 0x10006bfff TheElements arm64 /var/mobile/Containers/Bundle/Application/CB86658C-F349-4C7A-B73B-CE3B4502D5A4/TheElements.app/TheElements


参考资料
a. 《Understanding and Analyzing iOS Application Crash Reports 》,iOS Crash分析官方文档
b. 《iOS Crash文件的解析(一)》,一篇中文博客

ios不像Android可以ddms抓取。
1、ios用自动化工具instrument或者monkey跑的时候会调用xcode的模板,这个模板会有trace文件,通过trace文件解析可以知道时间和操作元素哪里crash。
2、另外,你的app crash后在你手机里面会有崩溃日志的,你用iTools找到plist对应的文件给开发看
3、第三个文件是dsym二进制符号表的堆栈信息,验证xxx.crash、xxx.app和xxx.dSYM三者的uuid是否一致。这个开发知道,必须告诉开发对应编译版本和你的plist文件一起,开发才能真正解析出bug产生日志。

首先说iphone 3G为什么会慢,因为iOS4需要消耗大量的RAM,而iphone 3G的128MB的RAM太小了,以至于iOS4精简了也无法流畅运行,如果解决只有两个途径: 1,刷机,目前来说1代和2代的iphone可以随意刷任何版本的固件,直接刷回3.1.3即可(下载固件,进入itunes,shift+恢复选择你下载的固件即可刷机) 2,为了功能继续使用高版本,但是比较麻烦,首先你必须越狱,否则无权限执行优化操作,建议升级iOS 4.1固件(4.1为3G优化了,能节省20MB左右的RAM) 升级后越狱(用绿毒),然后第一步用91或ifunbox或ifile等软件进入系统目录:/System/Library/LaunchDaemons 剪切以下文件至一个文件夹(意思就是删掉这些文件,但是为了以防万一误删,请备份,所以剪切) com.apple.AOSNotification.plist com.apple.chud.chum.plist com.apple.chud.pilotfish.plist com.apple.CrashHousekeeping.plist com.apple.datamigrator.plist com.apple.DumpBasebandCrash.plist com.apple.DumpPanic.plist com.apple.ReportCrash.DirectoryService.plist com.apple.ReportCrash.Jetsam.plist com.apple.ReportCrash.plist com.apple.ReportCrash.SafetyNet.plist com.apple.ReportCrash.SimulateCrash.plist com.apple.ReportCrash.StackShot.plist 这些文件是一些系统服务,比如错误报告等没用的垃圾服务,不影响,重启生效,节省20MB左右RAM。 然后用Cydia安装虚拟内存(第一中文源里的就可以用),把你的部分ROM当成RAM用,然后最后就是换一个字体,推荐第一中文源里的微软字体,作用是第三方字体预读速度比系统字体快,以提高软件启动速度。 如果不嫌电用的快的话也可以安装CPU超频。 经过以上优化你的iphone速度将会有质的飞跃!祝你成功! 希望我的回答能帮助到你,我的ipod团队为您服务。


你是否需要了解?

求助,请各位帮我看看导致app crash的原因.该怎么分析错误
不过这并不是100%有效的,而且大多数开发者并不依赖于此,因为这需要用户设备同意上传相关信息,详情可参见iOS: Providing Apple with diagnostics and usage information摘要。考虑到并不是所有iPhone用户都允许自动发送诊断报告(crash日志),而且对于部分提交到Apple得crash日志,开发者还需要手动去拉取,...

ios crash 符号化 app文件在哪
ios不像Android可以ddms抓取。1、ios用自动化工具instrument或者monkey跑的时候会调用xcode的模板,这个模板会有trace文件,通过trace文件解析可以知道时间和操作元素哪里crash。2、另外,你的app crash后在你手机里面会有崩溃日志的,你用iTools找到plist对应的文件给开发看3、第三个文件是dsym二进制符号表的...

求大神帮我分析下这个IOS崩溃日志是什么问题?
让我们开始动手吧!什么是崩溃日志,从哪里能得它?iOS设备上的应用闪退时,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上。崩溃日志上有很多有用的信息,包括应用是什么情况下闪退的。通常,上面有每个正在执行线程的完整堆栈跟踪信息,所以你能从中了解到闪退发生时各线程都在做什么,并分辨出...

ios程序crash
GSFont可呢是用的某个框架或者库里面定义的东西,这句的意思是,对于已经释放的对象再次释放。原因可能是在使用这个框架或者库的时候从外部接口调用了某个释放,导致这个接口内部实现的时候对它进行了释放(因为你可能看不到,如果没有源码的话)

如何查看iPhone Device上的crash log
方法一:将机器链接mac,同步完成之后.查看~\/Library\/Logs\/CrashReporter\/MobileDevice\/.但是这个方法有个问题:查看的log写的不是很详细.看第二个办法.方法二:使用xcode.打开xcode的organize,然后查看 Device logs,这里面有crash log的详细信息.

如何查看手机应用的崩溃报告
当应用在设备中运行发生崩溃,iOS将记录这些错误日志并且创建了崩溃报告(Crash Report)。崩溃报告中包含了iOS的'版本、日期、异常类型、堆栈跟踪以及其他信息。① 在Xcode中查看崩溃报告 当应用还在开发过程中发生了崩溃,则直接可以使用Xcode Organizer来查看崩溃报告。按如下操作:1.打开Organizer;2.选择“...

gf_crash是什么手机文件?
程序异常崩溃时产生的,用来调试跟踪,可以删掉,你可以试试,我个人觉得就是这个意思

iOS上传的crash日志在服务端是怎么处理的
1、iTunes同步获取大部分用户可能都会使用iTunes软件来管理iPhone或者iPad设备,这时候同步的Crash日志就会同步到电脑上,我们只需要在特定的路径里面寻找即可。MacOSX:~\/Library\/Logs\/CrashReporter\/MobileDeviceWindowsXP:C:\\Document

求助,请各位帮我看看导致app crash的问题在哪里
WWDC 2012的Session242 - iOS App Performance_ Memory是专门讨论内存管理这个话题。程序逻辑错误 数组越界、堆栈溢出、并发操作、逻辑错误。扎实的编码基础、严谨细致的工作习惯、清晰的思路可以避免这类错误;SDK错误 这个错误出现的现象是有的设备运行正常,有的会Crash。原因是未找到框架、类、方法、属性...

如何取得使用者的Crash Report 68 Techmemo
crash report并不是自动会透过iOS Device自动上传到Apple的,而是当iOS Device插上电脑的时候,它会问你要不要协助Apple改进它的使用经验,但很可惜的,相较於评分或是给评价的使用者,选择愿意传送的使用者又更是少数了,何况当你第一次选择不要传送,之後他也不会再问你是否要传送crash report了,这...