前段时间,项目重构完成,模块添加完毕,然后欣喜的准备上线。然后。就出现了下图的情景。
app只支持iPhone,不支持iPad,然后,悲剧原因都会有一个2.10
iPhone Apps must also run on iPad without modification, at iPhone resolution, and at 2X iPhone 3GS resolution(iPhone应用必须可以无条件运行在iPad上,支持普通iPhone分辨率和2倍iPhone 3GS分辨率。)
在iPad上运行崩溃。。
然而,由于本人没有iPad真机,所以在模拟器上调试,鼠标都点碎了,然而,还是找不到问题。。
只想求我心里阴影面积。。。
跟苹果工程师屡次交涉,甚至发邮件说我app不支持iPad,让其不要使用iPad测试,然而,并没有什么卵用。。
仍然悲剧。。
然后,悲剧邮件里边都会有crash Log,类似于这种样子的东西
然而。并不能看的懂。。。(本人菜鸟)
然后上网上查询 发现这个东西 是手机搜集的崩溃LOG信息
本地crashLog获取方法:
1.手机连接Mac
2.Xcode中 command+shift+2 ,选择对应的手机。 “ViewDeviceLog”. 就可以看到,如果有需要,可以自行导出
这是能拿到崩溃设备的前提下
但是,如果app上线之后用户安装了之后又产生的崩溃怎么才能知道呢。
这里可以,搜集崩溃信息
崩溃信息.crash 获取方式
下面列举一些我们常用的崩溃分析方式:
- 使用友盟、云测、百度等第三方崩溃统计工具。
- 自己实现应用内崩溃收集,并上传服务器。
- Xcode-Devices中直接查看某个设备的崩溃信息。
- 使用苹果提供的Crash崩溃收集服务。
然后这里不再赘述上面描述的情景,主要针对打包提交之后反馈回来的崩溃信息的解析
开始今天的主角:dSYM
不知道大家有没有注意过,在使用Xcode打包上传的时候,都会对应的生成一个xxx.app.dSYM文件 (xxx指项目名)
大家一定切记保存好这些文件, 以备以后通过.crash文件 来符号化 找到崩溃的代码行数
所以我们需要以下三个文件。
1>symbolicatecrash
2>xxx.crash
3>xxx.app.dSYM
note:确保文件的UUID相同,这样才能符号化解析出来。否则不能解析
.dSYM的取得
1.Xcode — organizer — Archive
2.选择相应版本,右键,showInFinder
3.显示包内容。
4.里边有个dSYMs文件夹,选择xxx.app.dSYM
或者Finder内前往路径
~/Library/Developer/Xcode/Archives
symbolicatecrash取得
Xcode自带的有symbolicatecrash工具,可以符号化 .crash 文件的崩溃信息,定位问题代码。
关于symbolicatecrash 的路径(以Xcode7.3为例,别的Xcode版本路径不同,请自行百度Google)。
打开终端。输入下面路径可以找到。
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
找到之后,桌面创建一个文件夹crashLog, copy symbolicatecrash ,crash文件,dSYM文件到桌面文件夹
终端命令:
cp /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Users/xxx/Desktop/crashLog/
(xxx指的是你Mac的名称)
然后cd到桌面crash文件夹
cd Desktop/
cd crashLog/
tips:
查看一下环境变量
xcode-select -print-path
返回结果应该是
/Applications/Xcode.app/Contents/Developer/
如果不是,则需要使用下面命令设置一下导出的环境变量
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
使用命令解析Crash文件,*号指的是具体的文件名
./symbolicatecrash ./xxxx.crash ./*.app.dSYM > symbol.crash
这样,你就会在crashLog文件夹里发现一个 symbol.crash的文件,重新打开。你就会发现,符号化crash文档就完成了。我们就可以成功定位到问题所在了。