本文分析了一份标准的iOS应用程序的Crash报告,它通常由以下6个部分组成。
报告头(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 -0700OS
Version: iOS 8.1.3 (12B466)
Report Version: 105
异常代码(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键,将强制退出应用。我们可以合理认为用户这么做的原因是应用程序没有响应。
关于符号化:http://blog.csdn.net/rainbowfactory/article/details/73332735
关于dsym文件:http://www.cocoachina.com/ios/20141219/10694.html
ips文件中各个线程都是地址,看不到具体的类和方法,需要通过解密,方法如下。
1.isp文件改为.crash文件
image.png2.打包时产生的xcarchive包
image.png3.连接设备使用log
image.png4.把.crash文件丢进alllogs里
image.png可以看到最终崩溃在28线程中的UACacheManager中。
网友评论