用 symbolicatecrash 符号化崩溃日志中系统库方法堆栈

说明

现在已经有很多第三方平台支持解析 crash 日志中的系统方法了,比如 bugly。但是万一遇到情况特殊或者公司要求,还是走上传崩溃日志到自己的服务器,然后自己去定期解析的话,就需要用到 symbolicatecrash 这个工具了。

指令操作均在终端中进行。

另外,每次打包上架提交审核的时候,把对应的.xcarchive 与 ipa 文件一同拷贝一份,按照版本号保存下来是个好习惯。

1. 前期准备工作

前期准备工作只需要在第一次尝试解析的时候进行,如果可以成功执行最终的命令行解析日志就不需要重复执行。

<1> 确定 Xcode 路径

执行如下指令

xcode-select --print-path

目的:确保 Xcode 路径存在。** 如果路径中有空格的存在,请把空格去掉。** 比如如果 Xcode 的名字是“Xcode 9.2”请修改成“Xcode9.2”或者“Xcode”否则后面你会遇到很多稀奇古怪的错误。

修改方法:应用程序→Xcode→重命名

<2> 添加 Xcode 路径

如果 Xcode 路径已经存在,或者不需要修改,请跳过这一步。注意如果改过 Xcode 应用的名字也需要进行这一步操作

执行如下指令

sudo xcode-select -s 路径

路径部分直接把 Xcode 应用内Developer文件夹拖拽进去会自动生成。

Developer 文件夹:应用程序→Xcode→右键,显示包内容→Contents 文件夹→Developer

<3> 确定 Xcode command line tools 是否安装

执行如下指令

xcode-select --install

如果输出以下内容说明已经安装,否则根据提示安装即可。

xcode-select: error: command line tools are already installed, use "Software Update" to install updates

2. 解析准备工作

解析所需文件

解析崩溃日志需要三个文件
①. 崩溃日志文件(通常为.crash 如果服务器上面是.txt 也没关系,直接下下来把尾缀改成.crash 就行)
②. 产生崩溃日志的 app 包对应的.dSYM 符号表(注意符号表和包一定要匹配。否则,堆栈方法会错乱)
③. 崩溃分析工具 symbolicatecrash(Xcode 自带)

.dSYM 符号表的获取:Xcode→window→organizer 选择 Archives→选择想要解析崩溃日志的 App 包→右键,show in finder→右键(.xcarchive),显示包内容→dSYMs→xxx.app.dSYM
如果自己这里没有 app 打包文件就只有跟打包的同事要。

symbolicatecrash 的获取:应用程序 (Applications)→Xcode→右键,显示包内容→Contents→SharedFrameworks→DVTFoundation.framework→Versions→A→Resources→symbolicatecrash

tips:如果到了 DVTFoundation.framework 这里打不开下一步了,选择如下浏览方式即可。

7929400-1a1b4958f3bb390a.png

3. 解析日志

<1> 将上述三个文件放在一个文件夹内

文件夹名称可以任意起,路径随意但最好不要出现中文。

<2> 在终端中进入该文件夹内

直接拖拽文件夹到路径部分会自动生成

cd 路径

<3> 解析日志

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

这个方法一次只能解析一个日志文件,然后输出一个解析过后的 symbol.crash 日志文件(会覆盖之前存在的 symbol.crash),这个输出的日志文件就是我们可以直接阅读的日志文件。symbol 部分可以任意修改成其他名字。

如果要解析多个日志文件,需要逐一将文件夹内的日志文件替换。或者将所有需要解析的日志文件全部放在文件夹内,但是每次指定需要解析的.crash 文件。

如果出现下面类似的错误,报错无法执行

Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line xx(数字).

执行指令

export DEVELOPER_DIR=Xcode Developer文件夹路径

像上面一样把 Developer 文件夹拖拽到等号后面路径部分就行,然后再执行解析指令就不会报错了。

<4> 查看解析结果

7929400-b45819bd6bc0fedf.png

可以看到最下面 app 部分的方法已经解析出来了(main),但是系统的仍然没有解析。那是因为 Xcode 中没有这个日志中提到的 8.3(12F70) 这个固件的系统符号文件,否则这里就会把系统方法的调用堆栈一并解析成可读的格式。而 symbolicatecrash 解析日志是依赖于 Xcode 的,所以我们就要找到日志对应 CPU 架构下对应版本的系统固件符号文件添加进 Xcode。

<5> 给 Xcode 添加对应固件的符号文件

①. 下载对应固件符号文件

这个需要结合崩溃日志的信息来,比如这里日志中提到崩溃发生的固件是 8.3(12F70)我们就要去找这个固件的符号文件,找的时候还要注意是否区分了 CPU 架构。下载地址放在后面

②. 下载完成后添加进 Xcode

打开 Finder:点击菜单前往→前往文件夹→输入
~/Library/Developer/Xcode/iOS DeviceSupport→前往

将下载好的符号文件放入定位到的路径里面。

7929400-a014156ccfdbdb9e.png

③. 再次解析日志文件

7929400-80d5e2be03f065ec.png