在iOS程序的崩溃中,主要有两种异常引起的。一个是Mach异常,一个是Object-C异常(NSException,OC层的异常)
平台
一条龙Crash统计产品
- Crashlytics
- Hockeyapp
- 友盟
- Bugly
成熟的开源项目
- KSCrash
- plcrashreporter
- CrashKit
Crash的收集方式
1、使用Xcode从设备获取崩溃日志:
如果你把你的手机连接到Mac,并选择Xcode->Windows->Device and Simulator,然后点击View Device Logs,你会看到手机上会有好多Log,其中Type为Crash的就是崩溃的Log
2、通过设备直接获取崩溃日志
- 打开设置->隐私->分析->分析数据,在其中找到你想要的应用程序的日志,日志将使用以下格式命名:<应用名称> _ <崩溃时间> _ <设备名>
- 选择所需的日志,复制文本或点击右上角的分享按钮分享出去,并且把分享得到的.ips.synced或者复制文本而来的.txt文件的后缀名改为.crash,因为Xcode不接受没有.crash扩展名的崩溃日志。
- 苹果爸爸审核时候给你发的.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文件
通过dSYM中存储的信息可以把crash日志中的16进制数字一一对应成我们看得懂的文件名、函数名和行号,这个过程就叫做符号化
校验文件
在符号化Crash文件之前,你需要准备好.crash和.dSYM并校验是否匹配
为什么要校验
- 因为符号集存储着文件名、函数名、行号的信息,每一次代码更改后编译符号集也会随之变更,所以要想符号化.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?
grep "'Your AppName' arm64" t.crash
获取.dSYM的UUID
dwarfdump --uuid 'Your AppName'.app.dSYM
获取.app的的UUID
dwarfdump --uuid 'Your AppName'.app/'Your AppName'
符号化文件
- 通过XCode自动符号化Crash文件
如果本地存在.crash对应的.dSYM文件,则直接到上文中(1、使用Xcode从设备获取崩溃日志:)到View Device Logs这步,把文件拖入右边的logs列表,Xcode会自动去符号化文件,如果满眼都是16进制数字的化,点击Re-Symbolicate Log
如果此时本地的Archive文件已经被你删除,需要把上述两个文件放入同一目录下(全英文目录),如果.dSYM你并没有备份,则需要回到crash日志对应的版本重新打包(论版本控制的重要性!),重复1)的步骤也可以得到符号化的日志。
- 通过命令行工具symbolicatecrash符号化
网友评论