做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友一点帮助。
什么是dSYM文件
Xcode编译项目后,我们会看到一个同名的dSYM文件,dSYM是保存16进制函数地址映射信息的中转文件,我们调试的symbols都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的dSYM文件,位于/Users/<用户名>/Library/Developer/Xcode/Archives目录下,对于每一个发布版本我们都很有必要保存对应的Archives文件。
dSYM文件有什么作用
当我们软件release模式打包或上线后,不会像我们在Xcode中那样直观的看到用崩溃的错误,这个时候我们就需要分析crash report文件了,iOS设备中会有日志文件保存我们每个应用出错的函数内存地址,通过Xcode的Organizer可以将iOS设备中的DeviceLog导出成crash文件,这个时候我们就可以通过出错的函数地址去查询dSYM文件中程序对应的函数名和文件名。大前提是我们需要有软件版本对应的dSYM文件,这也是为什么我们很有必要保存每个发布版本的Archives文件了。
通过Mac自带的命令行工具解析Crash文件需要具备三个文件
1.symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替换为响应的代码和具体行数。
2.我们打包时产生的dSYM文件。
3.崩溃时产生的Crash文件,例如:*.crash。
下面开始解析
第一步,在桌面新建一个文件夹,一般命名为Crash,然后将.Crash , ,.app.dSYM, symbolicatecrash三个放到这个文件夹里,首先找到.app.dSYM文件,打开xcode,window->Organizer打开之后,找到上传时候对应的版本然后show in Finder
到了这个界面之后显示这个包的内容
到了这个页面就可以看到.app.dSYM了
第二步,找到symbolicatecrash
首先给xcode打一个补丁:命令行运行
/usr/bin/xcode-select -print-path
如果输出"/Developer"或者其他非"/Applications/Xcode.app/Contents/Developer/"的内容,运行下面的命令:
sudo /usr/bin/xcode-select -switch/Applications/Xcode.app/Contents/Developer/
2.查找symbolicatecrash:
find /Applications/Xcode.app -name symbolicatecrash -type f
获取路径,这个命令可能执行的时间长一点,耐心等待一下,找到这个路径后复制下来,前往这个路径就可以找到symbolicatecrash,把它复制下来放到开始建的那个文件夹里,Xcode7.3我当时的路径是/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
第三步,把三个文件都放到那个文件夹里,然后在终端执行命令
1.首先切换到这个文件夹
cd /Users/app/Desktop/crash
2.解析这个Crash文件,*,xx指相应的文件名字,多个Crash文件,重复使用这个命令就行,不过一定要把导出的文件名symbol.text改一下,以免覆盖原来的
./symbolicatecrash ./*.crash ./xx.app.dSYM> symbol.text
3.如果上边的命令不成功,使用命令检查一下环境变量,返回结果是:/Applications/Xcode.app/Contents/Developer/
xcode-select -print-path
4.如果返回的不是上面的结果,需要使用下面的命令设置一下导出的环境变量,然后重新解析就行了
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后,会在Crash文件夹生成一个symbol.text
打开后图中红色部分就是崩溃的地方