iOS开发-dSYM文件

dSYM

根据 苹果官方文档,当编译器将源代码转为机械码时,会生成调试符号(debug symbols),通过这些符号可以将机械码映射回到源代码的位置,也就是我们常说的符号化解析

这些调试符号存储在二进制文件中,或者存储在相应的调试符号(dSYM)文件中。默认情况下,应用程序的调试构建将调试符号存储在编译后的二进制文件中,而应用程序的发布(Archive)构建将调试符号存储在相应的dSYM文件中,以减少二进制文件的大小。

通过Archive生成的包里面,都会有一个.dSYM文件

xcode的符号化解析

xcode可以帮我们进行符号化解析
点击Xcode顶部工具栏->Windows->Devices and Simulators->选中设备->View Device Logs就可以查看设备中崩溃信息,你也可以拖拽未符号化的.crash文件到左侧栏,xcode会自动帮你符号化解析.

值得注意的是,文件必须是.crash后缀才行,你可以将.txt等类型文件进行重命名后拖入
在这里插入图片描述
由于可执行文件区分各个架构,例如arm64,armv7s,i386,那么每个架构也有对应的.dSYM

每个架构的符号

符号是特定于操作系统版本和设备的CPU架构
例如,同一个包,运行iOS 13.1.0iPhone与运行iOS 13.1.2iPhone的符号不一样。如果您的应用程序运行在支持多种CPU架构(如arm64arm64e)的操作系统版本上,那么具有arm64架构的设备将只包含操作系统框架的arm64版本的符号,它不会有arm64e设备上的操作系统框架的符号

Bitcode相关

Bitcode是位于代码机械码之间的已编译代码的中间形式。

代码->Bitcode->机械码

这就意味着使用Bitcode设置的包,会在上传后,由App Store进行编译,是无法在打包编译时就获取到.dSYM,你可以在上传后,在Archive的界面进行下载。见 官方文档

在这里插入图片描述

定位你的dSYM

有时候你想知道对应某个崩溃日志的.dSYM文件是否存在在你的Mac上,你可以这样定位。

  1. 首先崩溃日志信息

在这里插入图片描述

这里如图,你可以查看崩溃堆栈的倒数第二行对应的App名称,通过命令查看其UUID

//这里test.crash为崩溃日志名
//TouchCanvas为app名
grep --after-context=1000 "Binary Images:" test.crash | grep TouchCanvas
//然后输出为 - 这里其实就是文本过滤下
0x1022c0000 - 0x1022effff TouchCanvas arm64  <9cc89c5e55163f4ab40c5821e99f05c6>

对应Binary imageUUID,通过格式转换为32个大写字符,8-4-4-4-12 (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),然后通过命令进行查看

mdfind "com_apple_xcode_dsym_uuids == 9CC89C5E-5516-3F4A-B40C-5821E99F05C6"

如果没有找到,是不会有任何输出的。如果应用使用Bitcode,就应该从App store下载.dSYM

如果没有找到对应的.dSYM,那么就无法解析,避免以后无法分析日志,就应该重新打包上传。

找到.dSYM后,还要进行构建的UUID对比


Build UUID对比

//PathToDSYMFile .dSYM路径
//BinaryName 二进制文件名,如上述的TouchCanvas
dwarfdump --uuid <PathToDSYMFile>/Contents/Resources/DWARF/<BinaryName>
//PathToBinary 二进制文件路径
dwarfdump --uuid <PathToBinary>

恢复隐藏的符号表文件

对于Bitcode打包的app,上传后下载的.dSYM中会用_hidden#109_等表示替换原有的符号,需要进行转换。

如果是通过xcode下载(Archive界面的Download Debug Symbols按钮下载的)的.dSYM是自动做了这个操作。

如果是通过网页App Store上下载的,就需要手动进行恢复

dsymutil -symbol-map <PathToXcodeArchive>/MyGreatApp.xcarchive/BCSymbolMaps <PathToDownloadedDSYMs>/<UUID>.dSYM

符号化解析操作命令

对于特殊的调试情况,例如LLDB命令行的崩溃日志信息,可以通过atos命令将崩溃报告符号化

atos -arch <BinaryArchitecture> -o <PathToDSYMFile>/Contents/Resources/DWARF/<BinaryName>  -l <LoadAddress> <AddressesToSymbolicate>

//BinaryArchitecture 为架构信息 arm64 ...
//PathToDSYMFile .dSYM文件路径
//BinaryName 二进制文件名
//LoadAddress 需要解析的地址
//AddressesToSymbolicate 符号表中的地址

例如下面:

atos -arch arm64 -o TouchCanvas.app.dSYM/Contents/Resources/DWARF/TouchCanvas -l 0x1022c0000 0x00000001022df754

//解析得到
ViewController.touchesEstimatedPropertiesUpdated(_:) (in TouchCanvas) + 304

命令行工具 symbolicatecrash 符号化

symbolicatecrash工具可以将Crash文件全部符号化,相比 atos 每条解析来说更方便快捷

# 找到 symbolicatecrash 工具并拷贝出来
find /Applications/Xcode.app -name symbolicatecrash -type f
# 会返回几个路径,拷贝其中一个
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

# 引入环境变量
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
# 符号解析
./symbolicatecrash appName.crash .dSYM文件路径 > appName.log
./symbolicatecrash appName.crash appName.app > appName.log
# 将符号化的 crash log 保存在 appName.log 中
./symbolicatecrash appName.crash appName.app > appName.log
发布了119 篇原创文章 · 获赞 30 · 访问量 9万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览