iOS 崩溃日志手动符号化小记

202 阅读2分钟

当 App 崩溃时,只有把崩溃日志(Crash Log)符号化(symbolicate),才能把 0x0000000100a05634 这样的地址翻译成具体函数和源码行号,进而快速定位问题。

1. 调试版(直接 Run 到测试机)

  • Xcode ▸ Devices and Simulators ▸ Open Recent Logs 中即可打开崩溃日志。
  • Xcode 在本地 Run App 时会自动生成并缓存对应的 .dSYM,因此日志会被 自动符号化,无需额外步骤。

2. 发布版(Archive 打包后安装到设备)

若崩溃发生在分发安装的包上,需要手动符号化

  1. 保存符号文件

    • Archive 完成后,从 Organizer 导出并妥善保存对应的 .dSYM
  2. 导出崩溃日志

    • 在测试设备中依次打开
      设置 ▸ 隐私与安全性 ▸ 分析与改进 ▸ 分析数据
    • 找到形如 “应用名–日期.ips” 的条目,导出到电脑
  3. 同目录准备文件

    • xxx.dSYMxxx.ips 放到同一文件夹,方便脚本读取。
  4. 执行符号化脚本

    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指定输出符号化结果
  1. 在Xcode中
    • 将生成的 xxxAPP.crash 后缀改为 .ips,双击即可查看

3. 示例代码

相关Demo代码存放到: github.com/wutao23yzd/… 演示用的dsym文件和崩溃日志存放在smybol目录下

1.以下代码的test1方法中,存在数组越界的崩溃 image.png 2.打包安装运行,未符号化前之前崩溃日志如下,我们看不出发生了什么问题

image.png 3.通过下图所示步骤,崩溃日志符号化后

符号化命令.png 4.可以明显看到,在test1方法出发生了数组越界的崩溃(记得将文件的.crash 后缀改为 .ips

image.png