App崩溃是比较常见的事,我们一般是集成bugly、友盟等三方库去采集日志。本文主要介绍分析用户设备里面的崩溃日志和苹果官网收集的崩溃日志。
如何获取崩溃日志
(1)通过Xcode-View Device Logs获取存储到设备里面的崩溃日志
点击xcode的顶部导航Window选项里面的Devices and Simulators
找到目标设备,点击View Device Logs
这个地方会搜索本机上面的所有日志,可以根据搜索条件进行筛选,找到自己需要的闪退日志
导出日志,保存到电脑上的某个目录
(2)通过Xcode-Organizer查看Apptore上面收集的崩溃日志
点击xcode的顶部导航Window选项里面的Organizer
选择要查看的应用,选择Crashes
xcode会自动下载闪退日志
针对这些崩溃日志,我们可以使用show In Finder找到崩溃日志,后面留作使用。也可以使用xcode提供的符号化工具进行日志解析
点击Symbolicate进行日志符号化,解析完后,会发现原来全是地址的地方变成了具体的方法
点击右侧的open in Project,选择对应的源码工程
在工程里面可以看到崩溃的堆栈信息,点击可以看具体崩溃方法
这种方式比较适合发布和开发是同一台电脑的情况。还有很多是多人协作,打包和发布是分开的情况,请看下面的方法。
使用symbolicatecrash符号化crash日志
当我们拿到日志文件,发现最关键的地方都是地址,没有具体的方法名字。
这也是我们为什么要符号化文件的原因?
什么是符号化?
简单来说,就是将机器能读取的内存地址转换成源码里面的具体类名、方法名等。 那我们需要知道方法和地址的关联关系,才能进行崩溃日志符号化。 xcode在每次生成app的时候,都会产生一个.dSYM的文件,这个文件里面就保存了地址和类名、方法之间的映射关系。
如何拿到dSYM文件
(1)通过源码工程里面的Products的.app文件,右键 show in Finder拿到跟app文件在同一级的dSYM文件
(2)通过organizer->Archives-拿到dSYM文件
如何进行符号化崩溃日志?
使用xcode自带的symbolicatecrash脚本进行日志符号化。
symbolicatecrash所在路径:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
为了方便进行符号化,建议将dSYM文件、symbolicatecrash、崩溃日志放在同一个目录下面。
cd到上面新建的文件夹后,执行./symbolicatecrash xxxx.crash>xxxx.crash
(第一个参数是要符号化的原日志文件,第二个参数是解析后保存的路径)
第一次运行,发现会报如下错误
应该是symbolicatecrash里面用到了定义的全局变量,
使用如下命令:
export DEVELOPER_DIR="/Applications/XCode.App/Contents/Developer"
然后再执行上面的./symbolicatecrash xxxx.crash xxxx.crash命令
如下图所示:
解析完成后会在文件夹出现新的日志文件
对比未符号化的崩溃日志和符号化后的崩溃日志,我们已经能看到具体的报错类名、方法了