Crash 排查
问题
线上 App 频繁崩溃,如何定位和修复?
答案
排查流程
符号化
# 使用 atos 符号化
atos -arch arm64 -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp -l 0x100000000 0x10000abcd
常见崩溃类型及修复
| 崩溃信号 | 常见原因 | 修复方向 |
|---|---|---|
| EXC_BAD_ACCESS | 野指针、已释放对象 | Zombie Objects 检测 |
| SIGABRT | 数组越界、未实现协议方法 | 检查 NSException 信息 |
| EXC_BREAKPOINT | Swift fatalError、强制解包 nil | guard let 替代 ! |
| SIGKILL (0x8badf00d) | 启动/后台超时被系统杀 | 减少主线程耗时 |
| EXC_RESOURCE | 内存/CPU 超限 | 优化资源使用 |
Address Sanitizer
// Xcode Scheme → Diagnostics → Address Sanitizer
// 可检测:
// - Use-after-free
// - Buffer overflow
// - Stack buffer overflow
常见面试问题
Q1: 如何建立 Crash 治理体系?
答案:
- 监控:接入 Sentry / Firebase Crashlytics,每日看 Top Crash
- 止血:P0 崩溃 24h 内修复,灰度验证
- 防劣化:CI 集成 Crash 率监控,新版本 Crash 率高于阈值自动暂停发布
- 目标:整体 Crash 率
< 0.1%(千分之一)
Q2: dSYM 文件是什么?
答案:Debug Symbol 文件,包含代码地址到源码行的映射。Release 构建会 strip 掉符号信息,崩溃堆栈只有内存地址。需要用 dSYM 文件还原出具体函数名和行号。每次 Archive 必须保存对应的 dSYM。