理解和分析iOS App Crash报告(二)

2,366 阅读3分钟

原文来自于Application Crash Report 这篇是第二部分, 主要讲crash report中的内容和异常类型

报告头部分(Header)

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: crash report的唯一标识符, 不同报告的标识符不可能相同.
  • CrashReporter Key: 设备标识符, 同一个设备产生的report设备标识符一样.
  • Process: crash进程的执行名, 与应用的CFBundleExecutable对应的名称一致.
  • Version: crash进程的版本号, 与应用的CFBundleVersionCFBundleVersionString一致.
  • Code Type: crash进程的目标体系架构, 应该是arm-64arm.
  • Role: 进程终止时执行的任务类型, 可以是ForegroundBackgroundUnspecified等.
  • OS Version: crash发生的系统版本.

异常信息(Exception Information)

不要与Objective-C和C++中的exceptions混淆(虽然这些exceptions也可能引起crash), 下面列举的是Mach的异常类型, 和提供crash信息的一些相关字段.

crash报告生成时, 异常信息的字段如下:

Exception Type: EXC_CRASH (SIGABRT) // Exception Type
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0 // crashed thread

由于引用了NULL指针引起的crash报告:

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

常见的异常类型

  • Bad Memory Access [EXC_BAD_ACCESS // SIGSEGV // SIGBUS], 访问非法地址. 如果在调用栈顶附近看到objc_msgSendobjc_release, 可能是因为向一个deallocated的对象发送消息引起的crash.
  • Abnormal Exit [EXC_CRASH // SIGABRT], 异常退出. 通常是因为没有捕获Objective-C或C++的异常信息而调用了abort().
  • Trace Trap [EXC_BREAKPOINT // SIGTRAP], 与异常退出相似. 是因为执行特定的断点进程时引起的崩溃, Swift代码在运行时遇到错误也可能产生这样的异常, 比如给non-optional类型赋值nil, 强制类型转换失败.
  • Illegal Instruction [EXC_BAD_INSTRUCTION // SIGILL], 尝试执行非法或未定义的指令. 可能尝试通过错误配置的函数指针跳转到无效地址.
  • Quit[SIGQUIT], 进程终止, 被另一个能控制此进程生命周期的进程终止. 在iOS中, 键盘扩展程序的加载时间过长时会被主app终止.
  • Killed[SIGKILL], 进程被系统终止.
  • Guarded Resource Violation [EXC_GUARD], 操作被保护的资源文件.
  • Resource Limit [EXC_RESOURCE], 资源消耗受限. 这不是一个crash, 而是系统提示进程占用了太多资源. WAKEUPS表示此进程中的线程在一秒内唤醒的次数太多, MEMORY表示进程占用过多内存.