Skip to main content

SIGTRAP 问题

目前遇到有一个偶发崩溃, 但同一个用户会反复出现, 需要调查并进行处理, 先看看具体情况.

崩溃具体情况

在 Intel 机器和 ARM 机器上均有出现, 具体情况就是出现 Swift Runtime erorr 而终止进程, 终止 Signal 为 SIGTRAP(ARM)/SIGILL(Intel), 详见官方文档.

在打包的 108/109/110 版本均有出现, 而且是零星用户稳定重现, 这个问题应就是某些 nil 问题引起的.

只要能在本地重现崩溃栈情况, 就可以处理这个问题, 目前看所有用户的崩溃栈情况均相同.

__builtin_trap() _dispatch_call_block_and_release

要解决问题, 应具备一些必要的知识.

Crash Report 分析

参考官方文档可以看到, 在崩溃日志中包含如下内容:

崩溃日志顶部是 header, 描述崩溃发生的上下文环境, 一个构造的 header 如下所示(实际崩溃可能只包含下面的部分信息):

Incident Identifier: 6156848E-344E-4D9E-84E0-87AFD0D0AE7B
CrashReporter Key: 76f2fb60060d6a7f814973377cbdc866fffd521f
Hardware Model: iPhone8,1
Process: TouchCanvas [1052]
Path: /private/var/containers/Bundle/Application/51346174-37EF-4F60-B72D-8DE5F01035F5/TouchCanvas.app/TouchCanvas
Identifier: com.example.apple-samplecode.TouchCanvas
Version: 1 (3.0)
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: com.example.apple-samplecode.TouchCanvas [1806]

Date/Time: 2020-03-27 18:06:51.4969 -0700
Launch Time: 2020-03-27 18:06:31.7593 -0700
OS Version: iPhone OS 13.3.1 (17D50)

其中:

  • Incident Identifier: 崩溃报告的唯一编号.
  • CrashReporter Key: 匿名的设备唯一 ID, 同一个设备的崩溃报告中这个 ID 是相同的.
  • Hardware Model: 设备模型, 即 APP 的设备类型.
  • Process: 崩溃的进程名, 这个和 APP plist 中的 CFBundleExecutable 值相同. 在方括号内的是 PID.
  • Path: 可执行程序的磁盘路径, 在 macOS 中可能会将能识别用户的字符替换为占位符以保护隐私.
  • Identifier: 程序的 bundle id.
  • Version: 包含版本号和 build 号
  • Code Type: 当前运行设备的 CPU 架构(ARM-64, ARM, X86-64, or X86).
  • Parent Process: 父进程名称和 PID
  • Date/Time: 发生崩溃的时刻
  • Launch Time: 启动 APP 的时刻
  • OS Version: 当前系统类型和版本, macOS 如 Mac OS X 10.12.6 (16G2136).

崩溃信息

崩溃信息中可能包含如下内容:

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000102afb3d0

其中:

  • Exception Type: 待续...