我们在ios开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应用,或者是release环境包导致的crash,我们就需要一些特殊的手段来通过crash log进行分析定位了。
通过参考网上的一些资料,总结了一下,下面介绍一下通过dSYM文件以及crash log分析定位的方法。
1.导出crash log
通过Xcode的Organizer查看某台iphone设备的DeviceLog,选择需要的crash log,导出XXX.crash文件。
2.找到对应的app文件
找到当前iphone设备上安装的ipa文件,更改文件后缀名为zip,解压后得到Payload文件夹,你需要的app文件就在其中了。
3.找到对应build版本的dSYM文件
dSYM文件是iOS编译后保存16进制函数地址映射信息的文件,每次应用程序build后,都会生成对应的xxx.app, xxx.app.dSYM文件。
4.确定dSYM、app以及crash文件的关系
首先将 dSYM、app以及crash放入同一个文件夹中,通过终端进入该文件夹。
每一个xx.app, xxx.app.dSYM文件都拥有相应的uuid,crash文件也有uuid,只有三者uuid一至才表明之三者可以解析出正确的日志文件。
查看xx.app文件的uuid的方法,在terminal中输入命令:
dwarfdump --uuid xxx.app/xxx (xxx工程名)
查看xx.app.dSYM文件的uuid的方法,在terminal中输入命令:
dwarfdump --uuid xxx.app.dSYM (xxx工程名)
而.crash的uuid位于,crash日志中的Binary Images:中的第一行尖括号内。如:
armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>
5.通过symbolicatecrash分析crash文件
Xcode有自带的symbolicatecrash工具,可以通过dSYM文件将crash文件中的16进制地址转换成可读的函数地址。该文件是隐藏文件,可以通过如下命令查找并拷贝到系统目录下,并建立快捷方式。
1)打开终端,进入到symbolicatecrash工具所在的文件夹目录
第一步:找到 symbolicatecrash工具所在的文件夹目录
find /Applications/Xcode.app -name symbolicatecrash(速度快)
或者
find /Applications/Xcode.app -name symbolicatecrash -type f
运行结果
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
第二步:进入该目录
cd /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
2)查找确认是否存在symbolicatecrash(可省略)
ls -al | grep symbolicatecrash
bogon:Resources bang$ ls -al | grep symbolicatecrash
-rwxr-xr-x 1 root wheel 37893 2 26 10:22 symbolicatecrash
3)将symbolicatecrash工具拷贝到 dSYM、app以及crash所在的文件夹
bogon:Crash bang$ cp symbolicatecrash /Users/bang/Desktop/Crash
4)执行如下命令,即可正确解析crash文件
./symbolicatecrash xxx.crash xxx.app.dSYM > test.txt
./symbolicatecrash DemoModel.crash CA3ACCD1-F63D-3A37-9773-82B155C02DA6.dSYM >crash2.txt
5)打开crash2.txt就可以看到符号化的崩溃日志了
2.通过友盟符号化设备的崩溃日志
如果出现bug的构建版本是在自己的电脑上打包的,那么直接打开终端输入黑色部分的代码就能定位到崩溃的代码位置;
如果出现bug的构建版本不是在自己电脑上打包的,那么需要找到对应的构建版本拷贝到自己项目中构建版本的目录中