当 App 崩溃时,只有把崩溃日志(Crash Log)符号化(symbolicate),才能把 0x0000000100a05634 这样的地址翻译成具体函数和源码行号,进而快速定位问题。
1. 调试版(直接 Run 到测试机)
- 在 Xcode ▸ Devices and Simulators ▸ Open Recent Logs 中即可打开崩溃日志。
- Xcode 在本地 Run App 时会自动生成并缓存对应的 .dSYM,因此日志会被 自动符号化,无需额外步骤。
2. 发布版(Archive 打包后安装到设备)
若崩溃发生在分发安装的包上,需要手动符号化
-
保存符号文件
- Archive 完成后,从 Organizer 导出并妥善保存对应的 .dSYM。
-
导出崩溃日志
- 在测试设备中依次打开
设置 ▸ 隐私与安全性 ▸ 分析与改进 ▸ 分析数据 - 找到形如 “应用名–日期.ips” 的条目,导出到电脑
- 在测试设备中依次打开
-
同目录准备文件
- 将
xxx.dSYM与xxx.ips放到同一文件夹,方便脚本读取。
- 将
-
执行符号化脚本
python3 /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py \ -d xxx.dSYM \ -p xxx.ips \ -o xxxAPP.crash
| 参数 | 作用 |
|---|---|
| -d | 指定.dSYM |
| -p | 指定原始ips日志 |
| -o | 指定输出符号化结果 |
- 在Xcode中
- 将生成的
xxxAPP.crash后缀改为.ips,双击即可查看
- 将生成的
3. 示例代码
相关Demo代码存放到: github.com/wutao23yzd/… 演示用的dsym文件和崩溃日志存放在smybol目录下
1.以下代码的test1方法中,存在数组越界的崩溃
2.打包安装运行,未符号化前之前崩溃日志如下,我们看不出发生了什么问题
3.通过下图所示步骤,崩溃日志符号化后
4.可以明显看到,在test1方法出发生了数组越界的崩溃(记得将文件的
.crash 后缀改为 .ips)