1. 使用 symbolicatecrash 解析 .ips 文件:
symbolicatecrash
是Xcode
自带的crash
日志分析工具
步骤1. 找到symbolicatecrash
,打开Terminal
执行:
find /Applications/Xcode.app -name symbolicatecrash -type f
稍等一会,就会输出路径,然后将路径复制,右键 Finder -> 前往文件夹 -> 粘贴 -> 回车,就能找到symbolicatecrash
,将symbolicatecrash
拷贝出来备用
步骤2. 将./symbolicatecrash
、crash
和dSYM
文件放在同一文件夹里
步骤3. 执行解析命令
代码语言:javascript复制./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
进行解析。
2. 使用 CrashSymbolicator.py 解析 ips 文件
步骤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. 分析
代码语言:javascript复制...
"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
。
3. 使用 atos 解析 crash 文件
命令格式:
代码语言:javascript复制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 为项目名
代码语言:javascript复制如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)
4. Helps
4.1 .ips 文件获取
- 设备 -> 设置 -> 隐私与安全性 -> 分析与改进 -> 分析数据 -> (对应app名 时间点)
- TestFlight 的可以在 iTunes Connect 获取到崩溃日志
iTunes Connect -> Manage Your Applications -> 对应app -> View Detail -> Crash Reports
(已符号化) - Xcode -> Window -> Origanizer -> Crash 获取 (需登录开发者账号) 需要用户共享分享,才能获取到他的崩溃日志 官方提供的崩溃信息不是实时的,只能查看两天前的崩溃信息,需要试试可以使用第三方工具
4.2 .crash 文件获取
设备连接电脑 XCode -> Windows -> Device and Simulator -> View Device Logs -> (对应app名 时间点) -> 右键 Export Log
4.3 获取 .dSYM 和 .app 文件
.dSYM
是十六进制函数地址映射信息的中转文件,调试的symbols
会包含在这个文件中,symbols
即类名、函数名等。
- 在
Archives
打包时,应该保存每个正式版的dSYM
和app
文件,以备定位线上问题使用
Window -> Organizer -> Archives -> 右键(需要的包) -> Show in Finder -> 右键 .xcarchive 显示包内容
Tips:Archives
包文件路径为:~/Library/Developer/Xcode/Archives
- debug模式获取
修改设置: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
-> 就能找到
4.4 使用 dwarfdump 查询 uuid
查询.dSYM
的uuid
,确保跟.ips
或.crash
文件的uuid
一致
dwarfdump -u <dSYM所在文件路径>
5. Tips
- Tips1: Apple deprecated symbolicatecrash at Xcode13.3, use atos instead
- Tips2: 有些
app
有很多dSYM
文件,需要把所有dSYM
文件都拷贝到待解析文件同一文件夹下 - Tips3:
simulator
不会生成crash
文件 - Tips4:
XCode
设置生成dSYM
文件,并跑到真机上,此时app
产生的.ips
文件会自动符号化
6. 总结
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
本文的描述很难不掺杂作者的主观意见,如果对文章中的内容有疑问,欢迎评论区提出不同的意见进行讨论