symbolicatecrash是Xcode自带的crash日志分析工具
步骤1. 找到symbolicatecrash,打开Terminal执行:
find /Applications/Xcode.app -name symbolicatecrash -type f稍等一会,就会输出路径,然后将路径复制,右键 Finder -> 前往文件夹 -> 粘贴 -> 回车,就能找到symbolicatecrash,将symbolicatecrash拷贝出来备用
步骤2. 将./symbolicatecrash、crash和dSYM文件放在同一文件夹里
步骤3. 执行解析命令
./symbolicatecrash 《crash文件绝对路径》 《拖入xx.app.dSYM里的xx文件》 > log.crash 回车可能会报错:
错误1:Error: "DEVELOPER_DIR" is not defined at /Users/yourname/Downloads/crash/symbolicatecrash line 69.
解决:执行export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer后重试
错误2:No crash report version in /xxx.crash at ./symbolicatecrash line 1365.
原因:Apple 在 Xcode13.3 已经废弃了symbolicatecrash
解决:如果需要使用,需要将.ips转化为之前的格式。可以使用 AppleCrashScripts 进行转化
步骤:
AppleCrashScripts项目,进入到项目目录下.ips 文件复制到AppleCrashScripts-master文件夹下:swift convertFromJSON.swift -i xxx.ips -o log.crash生成的log.crash就是旧格式的文件了,再用 ./symbolicatecrash 进行解析。
步骤1. 找到CrashSymbolicator.py文件,
find /Applications/Xcode.app -name CrashSymbolicator.py -type f
结果:
/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py
步骤2. 使用CrashSymbolicator.py和.dSYM 对.ips文件进行解析
python3 《CrashSymbolicator.p文件路径》 -d xxx.dSYM -p xxx.ips运行结果会直接显示在terminal里,需要的可以复制出来保存一下。
步骤3. 分析
...
"queue": "com.apple.main-thread",
"frames": [
{
"imageOffset": 117622764,
"imageIndex": 0,
"symbol": "__57-[QNBUALiveFeedCategoryChannelViewController viewDidLoad]_block_invoke",
"sourceFile": "QNBUALiveFeedCategoryChannelViewController.m",
"sourceLine": 80,
"symbolLocation": 32
},
...
]
...找到了崩溃时主线程正在执行的代码,invoke了一个空的block。
命令格式:
atos -arch <BinaryArchitecture> -o <PathToDSYMFile>/Contents/Resources/DWARF/<BinaryName> -l <LoadAddress> <AddressesToSymbolicate>即:atos [-o dSYM] -l loadAddress Address1 Address2 Address3
操作:
atos -arch arm64 -o 《拖入xxx.app.dSYM里的xxx文件》 -l 《基地址》《偏移后的地址》Tips: xxx 为项目名
如1:
atos -arch arm64 -o ~/xxx.app.dSYM/Contents/Resources/DWARF/xxx 0x10b3e47ec 0x1043b8000
atos -arch arm64 -o ~/xxx.app.dSYM/Contents/Resources/DWARF/xxx 0x104885ec0 0x1043b8000
-[TTAttributedLabel encodeWithCoder:] (in xxx) (TTAttributedLabel.m:1534)
-[QNBUAPosterVerticalPaddingPicViewModel posterBackgroundOperation] (in xxx) (QNBUAPosterVerticalPaddingPicViewModel.m:115)iTunes Connect -> Manage Your Applications -> 对应app -> View Detail -> Crash Reports (已符号化)设备连接电脑 XCode -> Windows -> Device and Simulator -> View Device Logs -> (对应app名+时间点) -> 右键 Export Log
.dSYM是十六进制函数地址映射信息的中转文件,调试的symbols会包含在这个文件中,symbols即类名、函数名等。
Archives打包时,应该保存每个正式版的dSYM和app文件,以备定位线上问题使用Window -> Organizer -> Archives -> 右键(需要的包) -> Show in Finder -> 右键 .xcarchive 显示包内容
Tips:Archives包文件路径为:~/Library/Developer/Xcode/Archives
修改设置:Xcode -> Targets -> Build Setting
2.1:Debug Infomation Format -> DWARF -> DWARF with dSYM File
2.2:Generate Debug Symbols -> YES
用真机编译就能生成.dSYM和.app文件了,在项目工程的Products文件夹里,右键 xxx.app 文件 -> Show in Finder -> 就能找到
查询.dSYM的uuid,确保跟.ips或.crash文件的uuid一致
dwarfdump -u <dSYM所在文件路径>app有很多dSYM文件,需要把所有dSYM文件都拷贝到待解析文件同一文件夹下simulator不会生成crash文件XCode设置生成dSYM文件,并跑到真机上,此时app产生的.ips文件会自动符号化CrashSymbolicator.py解析结果显示在 Terminal 里,且 没有保持原来的堆栈格式atos效率好低,需要按地址解析symbolicatecrash被废弃了,但文件进过转换还能用,且会解析一整个文件,还保留原来的堆栈格式(推荐使用)参考: Adding identifiable symbol names to a crash report Diagnosing issues using crash reports and device logs Acquiring crash reports and diagnostic logs Understanding Crashes and Crash Logs Analyzing a crash report iOS Debugging Magic iOS Crash 分析攻略 Debug Information Format
本文的描述很难不掺杂作者的主观意见,如果对文章中的内容有疑问,欢迎评论区提出不同的意见进行讨论