崩溃报告crash分析
每一个崩溃报告的每个部分都有崩溃原因的信息,一般分为6部分
1 报告头 (Header )
2 异常代码(Exception Codes)
3 应用详情(Application Specific Information)
- 回溯(Backtrace)
- 线程状态(Thread State)
- 二进制映像(Binary Images)
Header
标头:开头部分描述了崩溃发生的环境
Incident Identifier: 报告的唯一标识符,两份报告决不会共享同一个事件标识符
CrashReporter Key:每个设备的匿名标识符,来自同一设备的两个报告将包含相同的值
Hardware Model:运行该应用程序的特定设备型号
Process:崩溃的进程的可执行文件名称
Path:可执行文件在磁盘上的位置。macOS用占位符值替换了用户可识别的路径组件,以保护隐私
AppStoreTools:Xcode的版本
AppVariant:通过应用程序细化产生的应用程序的特定变体
Code Type:崩溃的进程的CPU体系结构。ARM-64,ARM,X86-64,或X86
Parent Process:启动崩溃进程的进程的名称和进程ID
Coalition:包含应用程序的名称
Date/Time :崩溃的日期和时间
Launch Time:应用启动的日期和时间
OS Version:发生崩溃的操作系统版本
异常信息(Exception Codes)
该部分告诉app过程如何终止
Exception Type:终止进程的Mach异常的名称,以及括号中相应终止信号的名称Unix
Exception Subtype:异常代码描述
Exception Note:并非特定于一种异常类型的其他信息。如果包含此字段,则崩溃不是由硬件陷阱引起的,要么是由于进程已由操作系统明确终止,要么是由于进程被称为。如果此字段包含,则进程不会崩溃,但是操作系统随后可能已请求终止进程。如果此字段包含,则该过程不会终止,因为创建崩溃报告的问题不是致命的
VM Region Info:区域信息
Termination Signal:终止信号
Termination Reason:操作系统终止进程时指定的退出原因信息
Triggered by Thread或Crashed Thread:引发异常的线程
Exception Type
异常类型(Exception Type) 有以下几种:
Bad Memory Access(坏内存访问) [EXC_BAD_ACCESS // SIGSEGV // SIGBUS],这种类型的 Exception 是最为常见的 Crash ,通常是由于访问了无效的内存导致的。
SIGSEGV:访问了无效地址,没有物理内存对应该地址,通常由于重复释放对象导致。
SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGBUS 访问的是有效地址,但总线访问异常,通常是访问了未对齐的数据。
SEGV:代表无效内存地址,比如空指针、未初始化指针、栈溢出等。Abnormal Exit (异常退出) [EXC_CRASH // SIGABRT]
SIGABRT:收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组或字典中等会遇到此类错误。(常见的是再网络请求时发生)。其它异常类型,有些异常类型没有被命名,以16进制数字表示。
0xbaaaaaad:意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态,由用户同时按[Home键]和音量键触发。
0xbad22222:当VoIP程序在后台太过频繁的激活时,系统可能会终止此类程序。
0x8badf00d:程序启动或者恢复时间过长被watch dog终止。
0xc00010ff:程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止。
0xdead10cc:程序退到后台时还占用[系统资源](如通讯录)被系统终止。
0xdeadfa11:程序无响应用户强制退出。当用户长按电源键,直到屏幕出现关机确认画面后再长按[Home键],将强制退出应用。我们可以合理认为用户这么做的原因是应用程序没有响应。
应用详情(Application Specific Information)
有些Crash出现时,会产生额外的信息,这些信息能帮助用户更好地了解应用程序终止时的运行环境。
回溯(Backtrace)
每个回溯的第一行列出了线程号和线程名。Xcode中的崩溃管理器提供的崩溃报告不包含线程名称。在线程号之后,回溯的每一行代表回溯中的堆栈
-
2
:堆栈帧号,堆栈帧按调用顺序排列 -
xxx
:正在执行的函数的二进制文件的名称 -
0x0000000107fc24a4
:正在执行的机器指令的地址 -
[AFURLSessionManagerTaskDelegate URLSession:task:didCompleteWithError:]
:在完全符号化的崩溃报告中,正在执行的函数的名称 -
62104740
:当前指令的字节偏移量。 -
AFURLSessionManager.m: 183
:包含代码的文件名和行号
线程状态(Thread State)
这部分列出了发生Crash的线程的状态,即寄存器和寄存器的值
二进制映像(Binary Images)
此列表包含上一示例中的组件:
-
0x104324000 - 0x108707fff
进程中二进制映像的地址范围。第一个地址是二进制文件的加载地址 -
xxx
二进制名称 -
arm64
CPU -
2xxxxxxxxxxxxxxxxxxxx3
唯一标识二进制映像的构建UUID。当符号崩溃报告时,使用此值来找到相应的文件 -
/var/containers/Bundle/Application/..
磁盘上二进制文件的路径