Crash日志的介绍

崩溃报告crash分析

crash.png

每一个崩溃报告的每个部分都有崩溃原因的信息,一般分为6部分
1 报告头 (Header )
2 异常代码(Exception Codes)
3 应用详情(Application Specific Information)

  1. 回溯(Backtrace)
  2. 线程状态(Thread State)
  3. 二进制映像(Binary Images)

Header

标头:开头部分描述了崩溃发生的环境


截屏2021-05-17 下午8.44.41.png

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)

截屏2021-05-20 下午4.35.58.png

该部分告诉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)

截屏2021-05-23 下午4.29.55.png

有些Crash出现时,会产生额外的信息,这些信息能帮助用户更好地了解应用程序终止时的运行环境。

回溯(Backtrace)

每个回溯的第一行列出了线程号和线程名。Xcode中的崩溃管理器提供的崩溃报告不包含线程名称。
24611262-ae2b2ad852292a85.png

在线程号之后,回溯的每一行代表回溯中的堆栈

  • 2 :堆栈帧号,堆栈帧按调用顺序排列
  • xxx:正在执行的函数的二进制文件的名称
  • 0x0000000107fc24a4:正在执行的机器指令的地址
  • [AFURLSessionManagerTaskDelegate URLSession:task:didCompleteWithError:]:在完全符号化的崩溃报告中,正在执行的函数的名称
  • 62104740:当前指令的字节偏移量。
  • AFURLSessionManager.m: 183:包含代码的文件名和行号

线程状态(Thread State)

这部分列出了发生Crash的线程的状态,即寄存器和寄存器的值


截屏2021-05-23 下午4.34.06.png

二进制映像(Binary Images)

24611262-90b566a1cb05ebaa.png

此列表包含上一示例中的组件:

  • 0x104324000 - 0x108707fff 进程中二进制映像的地址范围。第一个地址是二进制文件的加载地址
  • xxx 二进制名称
  • arm64 CPU
  • 2xxxxxxxxxxxxxxxxxxxx3 唯一标识二进制映像的构建UUID。当符号崩溃报告时,使用此值来找到相应的文件
  • /var/containers/Bundle/Application/.. 磁盘上二进制文件的路径

你可能感兴趣的:(Crash日志的介绍)