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 <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>
即: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
被废弃了,但文件进过转换还能用,且会解析一整个文件,还保留原来的堆栈格式(推荐使用)参考:
Diagnosing issues using crash reports and device logs
Acquiring crash reports and diagnostic logs
Understanding Crashes and Crash Logs
iOS Debugging Magic
iOS Crash 分析攻略
本文的描述很难不掺杂作者的主观意见,如果对文章中的内容有疑问,欢迎评论区提出不同的意见进行讨论