文章目录
- dSYM
- xcode的符号化解析
- 每个架构的符号
- Bitcode相关
- 定位你的dSYM
- Build UUID对比
- 恢复隐藏的符号表文件
- 符号化解析操作命令
- 命令行工具 symbolicatecrash 符号化
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.0
的iPhone
与运行iOS 13.1.2
的iPhone
的符号不一样。如果您的应用程序运行在支持多种CPU架构(如arm64
和arm64e
)的操作系统版本上,那么具有arm64
架构的设备将只包含操作系统框架的arm64
版本的符号,它不会有arm64e
设备上的操作系统框架的符号
Bitcode相关
Bitcode
是位于代码
和机械码
之间的已编译代码的中间形式。
代码->Bitcode->机械码
这就意味着使用Bitcode
设置的包,会在上传后,由App Store
进行编译,是无法在打包编译时就获取到.dSYM
,你可以在上传后,在Archive
的界面进行下载。见 官方文档
定位你的dSYM
有时候你想知道对应某个崩溃日志的.dSYM
文件是否存在在你的Mac
上,你可以这样定位。
- 首先崩溃日志信息
这里如图,你可以查看崩溃堆栈的倒数第二行对应的App名称,通过命令查看其UUID
//这里test.crash为崩溃日志名
//TouchCanvas为app名
grep --after-context=1000 "Binary Images:" test.crash | grep TouchCanvas
//然后输出为 - 这里其实就是文本过滤下
0x1022c0000 - 0x1022effff TouchCanvas arm64 <9cc89c5e55163f4ab40c5821e99f05c6>
对应Binary image
的UUID
,通过格式转换为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