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.png

xxx 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

你可能感兴趣的:(Crash的解析以及定位)