当我们收集iOS的崩溃信息时,获取到的崩溃堆栈一般是十六进制的内存地址形式,只有把他转成可读的形式才能定位问题。
崩溃堆栈里的函数地址可以借助dSYM文件来找到具体的文件名、函数名和行号信息的。实际上,在使用Xcode的Organizer查看崩溃日志时,就是根据本地存储的.dSYM文件进行了符号化的操作。
dSYM 符号集
dSYM符号集是我们对ipa文件进行打包之后,和.app文件同级的后缀名为.dSYM的文件,这个文件必须使用Xcode进行打包才有。
每一个.dSYM文件都有一个UUID,和.app文件中的UUID对应,代表着是一个应用。而.dSYM文件中每一条崩溃信息也有一个单独的UUID,用来和程序的UUID进行校对。
崩溃分析
通过命令行解析Crash文件需要具备三个文件
- symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替换为响应的代码和具体行数。
可通过以下命令找到symbolicatecrash路径
find /Applications/Xcode.app -name symbolicatecrash -type f
- 我们打包时产生的.dSYM文件
选中archive的版本右击,选择Show in Finder就可以选中archived 文件然后显示包内容,就可以找到dSYM文件了。 - 崩溃时产生的Crash文件,例如:*.crash
将.Crash、.dSYM、symbolicatecrash三个文件都放在我们在桌面建立的Crash文件夹中。
解析过程
- 开启命令行工具,进入崩溃文件夹Crash中
cd ....../Crash
- 使用命令解析Crash文件,*号指的是具体的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
如果上面命令不成功,使用命令检查一下环境变量
xcode-select -print-path
返回结果:
/Applications/Xcode.app/Contents/Developer/
如果不是上面的结果,需要使用下面命令设置一下导出的环境变量,然后重复上面解析的操作。
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后会生成一个新的.Crash文件,这个文件中就是崩溃详细信息
新解析方式
使用python3解析
find /Applications/Xcode.app -name CrashSymbolicator.py -type f
该位置的CrashSymbolicator.py不能移动,需把crash文件和dysm文件放到该层级下
执行
python3 CrashSymbolicator.py -d xxx.app.dSYM -o 2.crash -p 1.ips