crash处理

dSYM符号集:

  • 符号集是我们每次Archive一个包之后,都会随之生成的.dSYM文件,这个文件必须使用Xcode进行打包才有(Debug模式默认是关闭的)。每次发布一个版本,我们都需要备份这个文件,以方便以后的调试。
  • 符号集中存储着文件名、函数名、行号与内存地址的映射表,通过符号集分析崩溃的.Crash文件可以准确知道具体的崩溃信息。
  • 我们如果不使用.dSYM文件获取到的崩溃信息都是不完全的(官方文档说了会导致不完全符号化,也就是一部分符号化好了,一部分没有)。
  • 每一个.dSYM文件都有一个UUID,和.app文件中的UUID对应,代表着是一个应用,而.dSYM文件中每一条崩溃信息也有一个单独的UUID,用来和程序的UUID进行校对。

符号集的生成与获取:

  • 符号集在Organizer中选中打包的Archive->Show in Finder中选中Archive,右键显示包内容下的dSYMs文件夹下(或者点击Organizer右边的Download dSYM,XCode会从App Store下载该文件并插入到此Archive中)。
  • 如果在Debug模式下,找到项目的Build Settings
    Debug Infomatiion Format设置成DWARF with dSYM file
    并把Generate Debug Symbols置为YES
    然后编译,在项目文件夹Products中找到.app文件右击Show in Finder找到dSYM文件
![image](//upload-images.jianshu.io/upload_images/2709911-f1a56d595eedf921.png?imageMogr2/auto-orient/strip|imageView2/2/w/1196)

看到这里你可能已经知道,通过dSYM中存储的信息可以把crash日志中的16进制数字一一对应成我们看得懂的文件名、函数名和行号,这个过程就叫做符号化,那么如何做呢?

二、校验文件

在符号化Crash文件之前,你需要准备好.crash和.dSYM并校验是否匹配

image

为什么要校验:

  • 因为符号集存储着文件名、函数名、行号的信息,每一次代码更改后编译符号集也会随之变更,所以要想符号化.crash文件,.crash与符号集必须一一对应
  • 也就是说由版本为1.0的代码生成了1.0的APP,同时生成了1.0的符号集,1.0的APP发生了Bug,生成了104115的crash文件,也只有1.0的符号集才能够符号化104115的crash文件,而同时也必须找到1.0的代码才能根据符号化的crash文件精确定位到bug产生的地方。

如何判断.crash、.dSYM与.app(是否匹配你的代码)是否匹配?

  • 通过UUID来匹配,UUID是Xcode在编译时自动为每个版本生成的唯一标识,即使功能相同的可执行文件是使用相同的编译器设置从相同的源代码重建的,它也将具有不同的构建UUID,总之UUID是唯一的。

如何通过命令行获取UUID?

获取.crash的UUID

grep "'Your AppName' arm64" t.crash

获取.dSYM的UUID

dwarfdump --uuid 'Your AppName'.app.dSYM

获取.app的的UUID

dwarfdump --uuid 'Your AppName'.app/'Your AppName'

image

比如上图能看到三者的UUID都是一致的,可以安心去符号化文件啦。

三、符号化文件

1、通过XCode自动符号化Crash文件

1)如果本地存在.crash对应的.dSYM文件,则直接到上文中(1、使用Xcode从设备获取崩溃日志:)到View Device Logs这步,把文件拖入右边的logs列表,Xcode会自动去符号化文件,如果满眼都是16进制数字的化,点击Re-Symbolicate Log即可

image

2)如果此时本地的Archive文件已经被你删除,需要把上述两个文件放入同一目录下(全英文目录),如果.dSYM你并没有备份,则需要回到crash日志对应的版本重新打包(论版本控制的重要性!),重复1)的步骤也可以得到符号化的日志。

2、通过命令行工具symbolicatecrash符号化

如果你不想用Xcode去符号化,你也可以通过symbolicatecrash来手动符号化crash日志,symbolicatecrash是Xcode下的一个工具。
1)首先先找到这个工具,我们通过Spotlight搜索找到symbolicatecrash并复制到桌面的CrashSignifying文件夹中,在这个文件夹下同样放入.crash、.dSYM文件。
2)打开终端,进入你刚才创建的CrashSignifying文件夹中,输入命令行

export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer​

然后在输入

./symbolicatecrash /Users/你的电脑用户名/Desktop/CrashSignifying/xxx(崩溃日志名字).crash /Users/你电脑的用户名/Desktop/CrashSignifying/xxxx(dSYM文件名字).dSYM > Symbol_Crash.crash

如果报No such file or directory : at ./symbolicatecrash line 909.错误,尝试执行

./symbolicatecrash ./*.crash ./*.app.dSYM>Symbol_Crash.crash

作者:郡王丶千夜
链接:https://www.jianshu.com/p/ade5f6acf4d8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第三方

通过国内国外平台软件收集日志报告 Crashlytics,Hockeyapp ,友盟 等等。

推荐阅读更多精彩内容