目录
由一个问题说起:
在开发阶段,在使用ucardebug的过程中突然闪退,因为这个时候我的手机是没有处于调试中的,所以xcode不会把奔溃堆栈打出来,但这个奔溃确实是出现了,怎么处理?
经过研究,发现此时获取到奔溃信息的途径有这么2种:
1、通过设备直接获取崩溃日志
1)打开设置->隐私->分析->分析数据,在其中找到你想要的应用程序的日志,日志将使用以下格式命名:<应用名称> _ <崩溃时间> _ <设备名>
2)选择所需的日志,复制文本或点击右上角的分享按钮分享出去,并且把分享得到的.ips.synced或者复制文本而来的.txt文件的后缀名改为.crash,因为Xcode不接受没有.crash扩展名的崩溃日志。
2、使用Xcode从设备获取崩溃日志
把手机连接到Mac,并选择Xcode->Windows->Device and Simulator,然后点击View Device Logs,你会看到手机上会有好多Log,其中Type为Crash的就是崩溃的Log,如下图:
这个时候,我们就可以获取到奔溃信息了,但是这个时候都是一些16进行地址信息,根本没法看,所以,我们需要找到对应的符号文件对其进行解析。
3、dSYM符号集
dsym符号表的工作原理是什么?为什么通过它就可以转换为我们的源代码?请看这篇文章:
看似还是比较简单的,但我发现在我们APP所在的位置并没有对应的dsym符号表被生成,为什么?符号表你在哪里(哭脸)?后来发现,因为我们的工程使用的是cocopod进行三方库的管理,所以为了优化编译速度,在buildSetting中在debug环境中使用了”DWARF”而非”DWARF with dsym File“。为什么这么做?我想这篇文章或许能给你答案:https://zhuanlan.zhihu.com/p/112764192
好了,当我用Debug2Test去编译我的项目工程,dsym文件出现了。下面就是取解析我们的Crash文件。
4、利用dSYM解析符号集
准备好了一下文件,就可以对其进行解析了,具体文件如下:
- *.app文件
- *.dSYM文件
- *.ips文件
- CrashAnalyticScript.sh脚本文件
我们将这几个文件放到同一个文件夹下,然后执行脚本。实际解析是不需要*.app文件的,但我们需要确认app的UUID和dSYM的UUID是否一致,所以这里用它来验证一下。解析脚本下载地址:https://github.com/UCliwenbin/IOS-CrashAnalysis
先看下解析之前的crash的样子,这个已经是被控制台解析过的一部分:
可以看到,我们自己APP里还是16进制地址。再来看下解析后的效果:
可以看到函数的调用栈符号全被解析出来了,而且包括了符号所在的文件,行号等信息。