iOS 用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这里打不开下一步了,选择如下浏览方式即可。


iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈_第1张图片
image.png

3.解析日志

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

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

iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈_第2张图片
image.png

<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>查看解析结果

iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈_第3张图片
image.png

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

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

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

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

②.下载完成后添加进Xcode

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

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

iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈_第4张图片
image.png

③.再次解析日志文件

iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈_第5张图片
image.png

<6>固件符号文件下载地址

首先感谢iOS Crash分析必备:符号化系统库方法作者的无私分享。该文章的作者收集了几乎所有固件的符号文件并分享了出来,为了尊重原作者这里就不放下载地址了。大家可以在他的文章当中找到下载地址,以及目前收集了哪些固件符号文件。

你可能感兴趣的:(iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈)