-
App发生crash时系统会生成crash report,未被符号化的crash report 无法帮助我们进一步分析定位问题。
-
通过dSYM和其它工具将crash文件中用16进制数表示的内存地址转换成源码里的文件名、函数名和行号,这个过程就叫做符号化。
一、dSYM符号集
-
dSYM符号集中包括:
- 文件名
- 函数名
- 行号
- 内存地址映射表
-
dSYM文件和app二进制文件是一一对应,且每次构建都不相同。
建议,每次上架新版本,备份
归档文件.xcarchive
1. dSYM的生成
-
Target>Build Settings>Build Options>Debug information Format- 选择:
DWARF with dSYM File
- 选择:
-
Target>Apple Clang - Code Generation>Generate Debug Symbols- 设置为
YES
- 设置为
2. 获取方法:
-
方法一:
-
Release:
Window>Organizer>Archives>找到指定.xcarchive文件右键Show in Finder>右键显示包内容>xxx.app.dSYM -
Debug:
编译项目>项目Products文件夹>找到.app文件>右键Show in Finder>xxx.app.dSYM
-
-
方法二:
-
如果项目开启了Bitcode,Apple可能会进行二次编译生成不一样的dSYM文件,需要下载最新的dSYM文件。
-
Xcode下载:
Window>Organizer>Archives>找到指定.xcarchive文件>Download Debug Symbols -
appstoreconnect.apple.com下载:
进入指定App详情页面>活动>进入指定构建版本详情>下载dSYM//appstoreconnect下载下来的dSYM文件需要再通过如下命令解析(Xcode下载的已经自动处理过则不需要): $ xcrun dsymutil -symbol-map 文件路径xxx.xcarchive/BCSymbolMaps 文件路径xxx/xxx.dSYM
-
二、校验文件
-
即校验
.crash和.dSYM是否匹配,匹配上才能正确符号化crash文件。 -
编译后的得到的
.dSYM文件中的UUID是唯一的,如果和.crash文件中的UUID一致,则表示匹配成功 -
获取
.crash文件的UUID
方法一:
例如文件名为CrashDemo.crash
$ cd 到.crash文件位置
$ grep "CrashDemo arm64" CrashDemo.crash
输出:
0x1049d8000 - 0x1049dffff CrashDemo arm64 <95e0e1627bd8338e871e894ff3055fc6> /var/containers/Bundle/Application/1B54C1E3-4C58-4F6C-BE75-FE2A9A472CCD/CrashDemo.app/CrashDemo
其中 <95e0e1627bd8338e871e894ff3055fc6> 表示UUID。
方法二:
在.crash文件中找到`Binary Images`
对应值为:
0x1049d8000 - 0x1049dffff CrashDemo arm64 <95e0e1627bd8338e871e894ff3055fc6> /var/containers/Bundle/Application/1B54C1E3-4C58-4F6C-BE75-FE2A9A472CCD/CrashDemo.app/CrashDemo
- 获取
.dSYM的UUID
例如文件名为CrashDemo.app.dSYM
$ cd 到.dSYM文件目录
$ dwarfdump --uuid CrashDemo.app.dSYM
输出:
95E0E162-7BD8-338E-871E-894FF3055FC6 (arm64) CrashDemo.app.dSYM/Contents/Resources/DWARF/CrashDemo
- 获取
.app的UUID
例如文件名为CrashDemo.app
$ cd 到.app文件目录
$ dwarfdump --uuid CrashDemo.app/CrashDemo
输出
UUID: 95E0E162-7BD8-338E-871E-894FF3055FC6 (arm64) CrashDemo.app/CrashDemo
三、符号化
-
获取symbolicatecrash工具
打开Finder,快捷键 Command+Shift+G,输入: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash -
创建一个文件夹
将
symbolicatecrash工具、.dSYM、.crash三个文件放到该文件夹中 -
指定Xcode环境变量
$ export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" //查看环境变量 $ echo $DEVELOPER_DIR -
符号化crash文件
$ cd 到文件夹目录 $ ./symbolicatecrash xxx.crash xxx.dSYM > newSym.crash