跳转到内容

崩溃日志

进程崩溃时,系统会在设备上生成崩溃报告。本模块用于导出这些报告,并将其转换为易读的格式。

  1. 连接发生崩溃的设备。崩溃报告只保存在生成它的设备上。
  2. 打开崩溃日志。
  3. 按应用名称和时间找到对应的报告。
  4. 导出报告,或直接在界面中查看。

崩溃报告会持续累积。建议删除已处理的报告,本模块支持直接删除。

原始报告中只有内存地址,符号化会将地址还原为函数名和行号。

符号表必须与崩溃的二进制文件严格对应,即版本号和构建号都相同。请为每个发布的版本保留 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 二进制的栈帧。上方的系统栈帧通常只说明调用路径,您代码中最靠上的一帧才是排查的起点。

列表中有两类报告看起来像崩溃,实际并不是:

  • Jetsam / 内存报告。 进程因内存占用过高被系统终止。问题不在调用栈顶部,而在此前持续上涨的内存占用。请结合性能监控中的内存曲线分析。
  • 看门狗终止。 主线程被阻塞。调用栈只显示阻塞的位置,不显示阻塞的原因,请重点排查同步 I/O 和锁。
  1. 从发生崩溃的设备获取报告,同型号的其他设备不能替代。
  2. 查看崩溃时间点附近的实时日志,App 崩溃前输出的日志往往比调用栈更有参考价值。
  3. 查看使用记录,了解当时设备上的其他活动。
  4. 查看设备信息中的系统版本、剩余存储和电池健康。某些只在特定设备上出现的问题,实际与存储空间不足有关。

实时日志 · 性能监控 · 设备信息