Crash的解析以及定位
一、.dSYM
1.简介
.dSYM(debugging SYMbols)又称为调试符号表,是苹果为了方便调试和定位问题而使用的一种调试方案,本质上使用的是起源于贝尔实验室的DWARF(Debugging With Attributed Record Formats),其在.xcarchive目录中的层次结构为:
截屏2021-05-23 下午4.48.01.png
2.确定符号表和崩溃日志的一致性
终端输入:
xcrun dwarfdump --uuid /Users/xxxx/Desktop/xxxx.app.dSYM
即可获取对应.dSYM文件的UUID,这个UUID必须与.crash文件中的UUID相匹配
24611262-92d9db408a4009c7.png
二.通过.dSYM定位崩溃位置的三种方法
1. Symbolicatecrash
先介绍下Symbolicatecrash,symbolicatecrash 是 Xcode 中自带的perl脚本工具,通过iPhone的崩溃日志和应用的.dSYM文件定位发生崩溃的位置,把Crashed日志中的一堆地址替换成代码相应位置。
xxx.crash 文件的内容是十六进制显示的 ,给我们的分析排错造成很大阻力, 所以我们需要用到 symbolicatecrash 来符号化。
- 先在Mac 桌面创建一个新的文件夹,命名为crash
- 找到 symbolicatecrash文件,拷贝 symbolicatecrash 到 crash文件夹中。
symbolicatecrash文件路径为:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
- 找到 .dSYM 文件和.ipa以及.crash log文件,拷贝到crash文件夹中
- 终端 cd 进入 crash ,执行以下命令就可以生成最终的符号化的新 .crash 文件了
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
./symbolicatecrash ./*.crash ./*.app.dSYM > analysis.crash
analysis.crash 需要自己命名,这里使用的是 analysis
如果有报错可以使用以下命令,xxxx.crash 为原crash文件,再执行以上步骤
./symbolicatecrash /Users/xxx/Desktop/Crash/xxxx.crash
符号化前:
截屏2021-05-23 下午5.05.41.png
符号化后: 截屏2021-05-23 下午5.05.50.png
2. crash反解析
24611262-697db8c6488fbf19.pngxxx 0x0000000107fc24a4 0x104488000 + 62104740
0x104488000 符号表起始地址
0x0000000107fc24a4 崩溃发生运行时地址
62104740 偏移量
0x0000000107fc24a4 = 0x104488000 + 62104740
运行崩溃时堆栈地址 = 运行时起始地址 + 偏移量
atos已经封装了地址寻找,命令格式如下
atos -arch arm64 -o xxxx.app.dSYM/Contents/Resources/DWARF/xxxx -l 0x102134000 0x0000000106150124
既可以得到对应崩溃的方法以及行号
-[TestVc doAdd:level:zIndex:] (in xxx) + 616
如果是armv7就把arm64 换为armv7
3.dSYM工具
https://github.com/answer-huang/dSYMTools
使用起来比较简单
- 将打包发布软件时的xcarchive文件或者.dSYM文件拖入软件窗口内的任意位置
- 选中任意一个版本的xcarchive文件,或者.dSYM文件,右边会列出该xcarchive文件支持的CPU类型,选中错误对应的CPU类型。
- 对比.crash给出的UUID和工具界面中给出的UUID是否一致。
-
将错误地址以及 Slide Address 输入工具的文本框中,点击分析。
24611262-bf6935526acc0b51.png