在 iOS 开发中,闪退几乎是最典型的问题之一。但真正困难的地方是怎么找到崩溃日志中的代码的问题?
很多人第一次看到 .ips 文件时会有点头疼一堆十六进制地址,多线程调用栈,看起来像系统的问题,不是我代码问题
其实崩溃分析是有路径可循的,这篇文章结合我在项目中的实际处理方式,把过程拆开讲清楚。
第一步:先拿到正确的崩溃日志
在分析之前,最关键的一步是拿到完整、对应版本的日志
常见获取方式
Xcode(开发阶段)
- Devices and Simulators
- View Device Logs
适合开发调试,但不适用于测试环境。
用设备工具直接导出日志(更常用)
在测试或线上问题中,我更常用 克魔助手(Keymob) 来导出崩溃日志。
操作步骤
1 连接设备
- USB 连接 iPhone
- 打开克魔助手
2 进入日志目录
左侧选择:
文件管理 → 日志文件
3 找到 CrashReporter
进入:
CrashReporter
这里存放所有崩溃日志。
4 根据时间筛选
文件命名规则:
AppName-日期-时间.ips
例如:
MyApp-2026-03-21-103512.ips
根据用户反馈时间找到对应文件。
5 导出日志
- 勾选文件
- 点击保存
- 导出到本地
第二步:确认日志是否可用
拿到日志之后,不要急着分析。
先确认两件事:
- 是否是当前版本的崩溃
- 是否有符号表(dSYM)
如果没有符号化,调用栈基本不可读。
第三步:符号化(Symbolicate)
这是很多人卡住的一步。
方法一:Xcode 自动符号化
把 .ips 文件拖进 Xcode:
- 如果 dSYM 匹配,会自动解析
- 可以看到函数名
方法二:手动 symbolicate(必要时)
如果自动失败,需要:
- 对应版本的 dSYM
- 使用 symbolicatecrash 工具
第四步:真正开始“看日志”
符号化之后,日志就变得可读了。
重点看三个部分:
1 崩溃类型
例如:
- EXC_BAD_ACCESS
- SIGABRT
- KERN_INVALID_ADDRESS
这一步决定分析方向。
2 崩溃线程
日志中会标记:
Thread X Crashed
只看这个线程,不要一开始就看全部。
3 调用栈
从上往下看:
- 第一个是崩溃点
- 后面是调用路径
第五步:结合运行过程理解问题
日志只能告诉我们在哪崩溃,但不知道为什么崩溃。
这时候可以把崩溃时间和运行行为对齐一下
用实时日志补充上下文
在复现问题时,可以打开克魔助手的 实时日志,同时操作 App
当崩溃发生时,可以看到,崩溃前的日志输出,是否有异常提示
单看崩溃日志
在实际工作中,崩溃日志只是一个结果。
真正完整的分析需要:
- 崩溃日志(结果)
- 实时日志(过程)
- 业务逻辑(上下文)
三者结合才有意义。
一些容易踩的坑
实际用下来,有几个点特别容易出问题:
- dSYM 不匹配
- 分析错线程
- 忽略崩溃前日志
这些问题会导致分析方向完全错误。
参考链接:keymob.com/blog/175