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, 描述崩溃发生的上下文环境, 一个构造的 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
: 父进程名称和 PIDDate/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
: 待续...