0前言
对于我们iOS开发者来说,最心碎的事莫过于苹果审核一个星期后上架AppStore,而第二天就报出闪退bug, 我刚经历过,而且最坑的是由于个人开发维护很老的代码,经验不足,没有集成友盟的分析SDK(我们公司也不需要),有两台机器上出现了闪退。真是天无绝人之路,最重要的crash文件有了。下面我就来详细描述一下具体的心路历程以及分析方法。
1.设备中查看
- iOS app的所有崩溃日志都会记录在设备上,这个日志是苹果告诉用户的, 如下图1, 除了一些基本信息, 对于Last Exception Backtrace:红箭头指向内容, 表示完全看不懂,
- 所以对于和我一样没有集成让用户发送崩溃报告功能的iOS开发者来说,要获得crash文件就必须先连上崩溃过的机器,然后打开Xcode,选择Window -> Devices,选择你自己的机器,然后点击View Device Logs,这时候会打开一个小窗口,这就是你机器上至目前为止存的所有app的崩溃信息了。如果是好久没看过这个信息,打开后还要读取好久才能完全读完,总之,找到你的app最后一次崩溃记录,右键导出。如图2
![](https://img.haomeiwen.com/i1427515/e84ea8738723d4ef.png)
![](https://img.haomeiwen.com/i1427515/7f09326de2b3f8ca.png)
图一内容除了一些基本系统信息,其他对我们并没有帮助
图二必须的仔细查找, 才能在 Last Exception Backtrace:这一项, 隐隐约约找到一些方法
2.crash文件文件准备
我们先看一眼导出来的.crash文件,上半部分都是一些基本信息(基本没用),重点看下崩溃部分的记录,在红色箭头部分
看红框里的,隐隐有种不翔的预感,很像是字符串截取不对的问题啊,可下边几行写的都是啥,这怎么定位问题啊。先不管了,先在桌面上建个文件夹,就叫crash吧,然后把这个导出的.crash文件扔进去。想要再详细点的记录还缺几样东西呢。。。
找到你上次发布的ipa(如果实在没有了就再从Archives里导出来一个,但一定要保证是你上次发布用的那个),右键 -> 打开方式 -> 归档实用工具(就是解压缩),然后把Payload文件夹下的.app文件也扔到刚刚的crash文件夹里。
接下来还需要dSYM文件,还是在Archives里,找到发布用的那个,右键Show in Finder,如图
然后对文件夹中的这个.xcarchive文件右键,显示包内容,就可以看到一个名为dSYMs的文件夹,把里面的.dSYM文件拷出来,还是放到桌面的crash文件夹里。好了,还剩一个重头了,就是标题上说的symbolicatecrash工具。
symbolicatecrash是一个隐藏工具,它在我的Mac中的具体路径如下(Xcode6.1.app请换成你的Xcode名称)
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
你也可以在终端中输入命令搜索:
find /Applications/Xcode6.1.app -name symbolicatecrash -type f
把这个路径拷贝一下,然后粘到Finder的“前往文件夹”下,前往,就可以看到symbolicatecrash工具了,现在把它也拷到桌面的crash文件夹里。
至此,crash文件夹里现在有4个文件了,分别是.app, .crash, .dSYM, symbolicatecrash。接下来就是用终端敲命令,生成更易分析的crash。
3. 查看 crash 文件
首先用cd命令进入到crash文件夹下,然后输入以下命令
./symbolicatecrash /Users/xxxx/Desktop/crash/InOrder.crash /Users/xxxx/Desktop/crash/InOrder.app.dSYM > Control_symbol.crash
上述命令中,"xxxx"和"InOrder"请自行替换成对应的名称。运行,这时候终端可能会报错Error: "DEVELOPER_DIR" is not defined at /usr/local/bin/symbolicatecrash line 53. 这时候在终端中再输入如下
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
然后再跑一下刚刚的那个命令,这时候看一下桌面的crash文件夹下就会多出一个名为“Control_symbol.crash”的文件,这就是可定位问题的crash文件了,我们打开看一下。
![](https://img.haomeiwen.com/i1427515/b60c358a42498fe1.png)
![](https://img.haomeiwen.com/i1427515/8814d2fd29868632.png)
现在红框里原来的那些乱七八糟的东西已经“翻译”成了崩溃在具体的哪个方法了。下面就是进行合理的猜想和调试了,
比如我的崩溃就是因为这个第三方时间选择控件使用截取字符串的形式来获得时间,像09:23 PM就被固定的拆成了时、分、上下午标识3段,结果用户使用24小时制的时候,时间就成了21:23,没了上下午标识,array[2]超出下标妥妥的闪退。想想我脑洞也是蛮大的,这种问题原因都被猜到了。。。
4.结束语
iOS开发真的不像安卓那样, 有日志可以随时查看, 实时监测,(比如说同事可以eclipse连接小米手机 , 打开优酷, 点击哪个按钮, 切换哪个页面, 调用哪个方法, 日志都能看到, 太神奇了), 但是苹果好像不能,那么多大神, 应该不会都不知道的, 好在能知道出问题的方法了 看到的东西更多一点了, 解决问题就好
如果还有哪里写得不明白的可以在下边评论中回复~~
网友评论