文章目錄
- 1. 使用 symbolicatecrash 解析 .ips 文件:
- 2. 使用 CrashSymbolicator.py 解析 ips 文件
- 3. 使用 atos 解析 crash 文件
- 4. Helps
- 4.1 .ips 文件獲取
- 4.2 .crash 文件獲取
- 4.3 獲取 .dSYM 和 .app 文件
- 4.4 使用 dwarfdump 查詢 uuid
- 5. Tips
- 6. 總結
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. 執行解析命令
./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. 分析
...
"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 文件
命令格式:
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)
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
被廢棄了,但文件進過轉換還能用,且會解析一整個文件,還保留原來的堆棧格式(推薦使用)
參考:
Diagnosing issues using crash reports and device logs
Acquiring crash reports and diagnostic logs
Understanding Crashes and Crash Logs
iOS Debugging Magic
iOS Crash 分析攻略
本文的描述很難不摻雜作者的主觀意見,如果對文章中的內容有疑問,歡迎評論區提出不同的意見進行討論