对Crash文件,dSYM文件进行符号化
今天对iOS 的crash文件dSYM文件符号化研究了一下,参考网上的文章实际操作了一把,也走了一些弯路,把我的操作流程简单介绍一下.
获取测试机的crash log
通过Xcode获取到崩溃日志,方法是Xcode->Window->Devices
看到demo RunLoop 的crash信息,右键选中导出文件到指定文件夹方便下一步操作
获取dSYM文件
我们每次Archive一个包之后,都会随之生成一个dSYM文件。每次发布一个版本,我们都需要备份这个文件,以方便以后的调试
Xcode->Window->Organizer->右键选中show in Finder-> xcarchive显示包内容->xxx.app.dSYM (xxx 工程名)
符号化
通过Mac自带的命令行工具解析Crash文件需要具备三个文件
1.symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替换为响应的代码和具体行数。
获取symbolicatecrash工具
打开终端输入以下命令:
find /Applications/Xcode.app -name symbolicatecrash -type f
我找到的路径是:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
根据路径前往文件夹找到symbolicatecrash ,将其复制到刚才指定文件夹
2.我们打包时产生的dSYM文件。
3.崩溃时产生的Crash文件,例如:*.crash。
我在解析崩溃信息的时候,首先在桌面上建立一个Crash文件夹,然后将.Crash、.dSYM、symbolicatecrash放在这个文件夹中,这样进入这个文件夹下,直接一行命令就解决了。
屏幕快照 2017-03-29 上午12.09.55.png核对uuid是否一致
如何将文件一一对应
每一个 xx.app 和 xx.app.dSYM 文件都有对应的 UUID,crash 文件也有自己的 UUID,只要这三个文件的 UUID 一致,我们就可以通过他们解析出正确的错误函数信息了。
1.查看 xx.app 文件的 UUID,terminal 中输入命令 :
dwarfdump --uuid xx.app/xx (xx代表你的项目名)
2.查看 xx.app.dSYM 文件的 UUID ,在 terminal 中输入命令:
dwarfdump --uuid xx.app.dSYM
3.crash 文件内 Binary Images: 下面一行中 <> 内的 e86bcc8875b230279c962186b80b466d 就是该 crash 文件的 UUID,而第一个地址 0x1000ac000 便是 slide address:
Binary Images:
0x1000ac000 - 0x100c13fff Example arm64 <e86bcc8875b230279c962186b80b466d> /var/containers/Bundle/Application/99EE
准备工作完成,开始符号化操作
- 打开终端,cd到当前crash文件夹,输入命令
./symbolicatecrash RunLoop.crash RunLoop.app.dSYM > jieguo.crash
如果报错 Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69. 需要 执行命令
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
然后重新 输入命令
./symbolicatecrash RunLoop.crash RunLoop.app.dSYM > jieguo.crash
这样就看到一个名字jieguo.crash 已经符号化的文件了
参考资料
命令行工具解析Crash文件,dSYM文件进行符号化
iOS调试之 crash log分析
符号化iOS Crash文件的3种方法
iOS Crash文件分析
iOS崩溃调试技巧