崩溃日志
进程崩溃时,系统会在设备上生成崩溃报告。本模块用于导出这些报告,并将其转换为易读的格式。
- 连接发生崩溃的设备。崩溃报告只保存在生成它的设备上。
- 打开崩溃日志。
- 按应用名称和时间找到对应的报告。
- 导出报告,或直接在界面中查看。
崩溃报告会持续累积。建议删除已处理的报告,本模块支持直接删除。
原始报告中只有内存地址,符号化会将地址还原为函数名和行号。
符号表必须与崩溃的二进制文件严格对应,即版本号和构建号都相同。请为每个发布的版本保留 dSYM 文件;缺少该文件时,任何工具都只能将您自己代码的栈帧显示为十六进制地址。系统栈帧使用对应 iOS 版本的系统符号还原。
建议按以下顺序阅读报告。
1. 异常类型。 这一行包含的信息最多。
| 类型 | 通常意味着 |
|---|---|
EXC_BAD_ACCESS(SIGSEGV) |
访问了无效内存,例如已释放的对象或野指针 |
EXC_CRASH (SIGABRT) |
未捕获的异常、断言失败,或主动调用 abort() |
EXC_BREAKPOINT (SIGTRAP) |
Swift 运行时错误,例如强制解包 nil、数组越界、强制类型转换失败 |
EXC_RESOURCE |
超出资源限制,常见于内存过高或长时间高 CPU 占用 |
0x8badf00d |
看门狗终止:启动或响应过慢,被 iOS 终止 |
0xdead10cc |
进入挂起状态时仍持有文件锁或共享资源 |
2. Terminating description。 如有这一行,会直接指出触发的断言或异常。请先阅读这一行,再查看调用栈。
3. 崩溃线程。 报告中会明确标注崩溃线程,重点查看这条调用栈。
4. 您自己代码的栈帧。 在崩溃线程中向下查找属于您 App 二进制的栈帧。上方的系统栈帧通常只说明调用路径,您代码中最靠上的一帧才是排查的起点。
两类不属于崩溃的报告
Section titled “两类不属于崩溃的报告”列表中有两类报告看起来像崩溃,实际并不是:
- Jetsam / 内存报告。 进程因内存占用过高被系统终止。问题不在调用栈顶部,而在此前持续上涨的内存占用。请结合性能监控中的内存曲线分析。
- 看门狗终止。 主线程被阻塞。调用栈只显示阻塞的位置,不显示阻塞的原因,请重点排查同步 I/O 和锁。
