先上文件,這里放上 dsym 文件夾的鏈接,可以自己下載放到桌面上腳本打開執行先試一試,crash文件夾可以直接使用,ips 文件夾需要修改腳本里面的路徑。如有錯誤請幫忙指出,謝謝!轉載請注明出處,喜歡的話,請點個贊吧!
github
百度網盤 碼 ona1
誠通網盤 碼 7701
1.什么是dSYM文件
dSYM 文件是Xcode編譯后,我們會看到一個同名的 dSYM 文件,dSYM 是保存 16 進制函數地址映射信息的中轉文件,存儲應用程序的調試 symbols。每次編譯項目或者打包的時候都會生成一個新的 dSYM 文件,當我們軟件release模式打包或上線后,不會像我們在Xcode中那樣直觀的看到用崩潰的錯誤,所以對于每一個發布版本我們都很有必要保存對應的 Archives 文件。不管你集沒集成類似Buyly的三方,要符號化分析crash日志還是得要用到對應的dSYM文件,如果沒有生成dSYM文件,可以看一下TARGETS下Build Settings里面有沒有設置,如下圖,文章可能有點啰嗦,請耐心瀏覽。
2.什么時候會用到dSYM文件
1、APP提交審核,有閃退bug被拒,審核人員基本會上傳crash文件給你,這時候就要自己符號化分析了。
2、你們編譯給測試同事的包,如果你們關系好,大概率會重現一遍給你看,不然可能就是導出一個ips文件直接丟給你了,也可能還有一些不太好復現的crash。
3、自己有時候調試的時候可能會用到。
注:ips文件和crash文件不一樣,Xcode13,iOS15以前設備ips文件改后綴成crash好像可以,但是之后 Apple 對符號化文件格式進行了 JSON 支持, 所以針對 iOS 15 以上產生的崩潰文件, 寫入方式應該是做了調整, 所以在對 iOS 15 以上崩潰文件進行符號化時, ips改后綴會出現符號化失敗, 報錯 No crash report version in file 的問題,改為直接使用 CrashSymbolicator.py下面會講到。
注:如果是發布Testflight版本,有些公司APP更新前會先提交Testflight版本公測一下,然后很多crash的日志可以通過Apple Store Connect里面對應的應用,Testflight下的反饋崩潰里面看到,可以直接Xcode打開,直接到Window->Organize->Crashes下直觀看到崩潰錯誤
3.dSYM,ips,crash文件怎么拿到
1、dSYM
編譯后Xcode13以前應該在項目的Products文件夾下,右鍵Show in Finder。
Xcode13后位于(/Users/用戶名/Library/Developer/Xcode/DerivedData/對應的應用程序/Build/Products/Debug-iphoneos)。
打包的話位于(/Users/用戶名/Library/Developer/Xcode/Archives)目錄下,也可以在Xcode選擇Window->Organize->Archives,Show in Finder。
2、crash
手機插上電腦Xcode選擇Window->Devices and Simulators,找到對應的iphone,View Device Logs,右鍵Export Log。
3、ips
可能是測試同事可能其它同事可能用戶,手機不能連接到電腦,可以在手機設置->隱私->分析與改進->分析數據,可以搜索對應的.ips.sycned文件然后查看導出修改成.ips的后綴就行,如果不是一眼能看到就直接搜項目名字。
4.具體怎么利用dSYM符號化分析
注:dSYM文件要和crash,ips等文件一一對應,否則符號化會失敗,比如你1.0.1產生的crash,ips文件要和1.0.1編譯的dSYM文件匹配,注意每次編譯都會生成新的dSYM文件
1、怎么查看dSYM和ips,crash文件是否一一對應
筆者創建的項目叫Test,查看crash,ips直接雙擊打開查看,在下面例子圖有標記,dSYM使用終端命令查看如下,Test.app.dSYM修改為對應的就行
dwarfdump --uuid Test.app.dSYM
例子如下,終端顯示的是符號 - 拼接的,crash和ips文件都是連起來的。
2、利用symbolicatecrash符號化分析crash文件
注:創建文件夾和文件夾放在哪都能自己看著辦只要用到對應文件路徑的時候,路徑能對應就可以了,以下是筆者自己創建的方式。
首先在桌面創建一個dsym文件夾,里面再創建一個crash文件夾,dYSM文件和.crash文件拖入進去,symbolicatecrash復制進去(如果不復制工具出來,可以把文件復制到工具文件夾下執行命令),Result.crash是符號化分析后的產物,Makefile是一個用AppleScript寫的一個腳本,打開執行就能得到Result.crash(前提里面寫的一些路徑得一一對應),還可以保存成一個應用程序雙擊打開執行,具體更多好玩的得自己去了解一下。symbolicatecrash工具存放在該路徑下:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources
如果不一樣可能是Xcode名字不一樣?可以利用下面的命令去查找,如過你的Xcode就叫Xcode話,不然改成自己Xcode路徑:
find /Applications/Xcode.app -name symbolicatecrash -type f
當三個文件都在同一個文件夾下后,我們可以通過命令來得到符號化分析后的crash文件,依次執行,命令如下:注:如果不執行第二條命令會有意想不到的結果
1 cd Desktop/dsym/crash
2 export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
3 ./symbolicatecrash Test.crash Test.app.dSYM > Result.crash
我們可以先來看看Test.crash日志符號化前后最后異常回溯長什么樣子:
3、利用atos命令定位問題
其實除了symbolicatecrash工具,atos命令也能簡單的分析一下,Test.app.dSYM/Contents/Resources/DWARF/Test 這里就存著具體符號
atos -o 項目名.app.dSYM/Contents/Resources/DWARF/項目名 -l 基地址 偏移后的地址
筆者使用的命令參考如下
atos -o Test.app.dSYM/Contents/Resources/DWARF/Test -l 0x1026b4000 0x1026B9904
得到的結果如上,沒錯就是最后異常回溯的第5行,有沒有發現偏移后的地址和第6行的第一個地址是一致的,所以第1個地址是開始地址,第2個地址是基地址,第3個 + 22788就是偏移量 這是十進制的,計算如下 0x1026b4000 + 0x000005904(22788轉16進制后的值)= 0x1026B9904 直接百度16進制加減法,大佬可以除外
4、利用CrashSymbolicator.py符號化解析 ips 文件
CrashSymbolicator.py腳本存放在該路徑下:
/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources
如果不一樣可能是Xcode名字不一樣?可以利用下面的命令去查找,如過你的Xcode就叫Xcode話,不然改成自己Xcode路徑:
find /Applications/Xcode.app -name CrashSymbolicator -type f
但是這回不能像復制symbolicatecrash工具一樣復制出來了,因為這個腳本import其它文件也在同一個目錄下,我們可以終端命令進入到這個文件夾下把 dSYM 文件和 ips 文件放入到該文件夾下執行符號化解析命令。
下面先看兩個文件的對比。
CrashSymbolicator.py 操作稍微和 symbolicatecrash 會有些不同,因為是用 python 寫的腳本,所以要使用 python3 來進行調用,否則會報錯。(肯定有一大波人默默的在終端輸入python查看版本號發現還是2.7左右的版本,內心一頓XXX,其實python3早已經安裝了,不信你們終端直接輸入python3試試,如果沒有那得自己安裝了……)
python3 CrashSymbolicator.py -d /xxx.app.dSYM -o /xxx.crash -p /xxx.ips
-d '符號表路徑' -o '輸出符號化路徑' -p '蘋果給的崩潰日志'
如果是在 CrashSymbolicator.py 文件夾下操作,dSYM 和 ips 文件需要復制到該腳本文件夾下,命令如下:
1 cd /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources
2 sudo python3 CrashSymbolicator.py -d Test.app.dSYM -o Result.ips -p Test.ips
5.利用AppleScript腳本快速進行符號化分析
上述在文件夾里面執行命令雖然可以完成,但是比較麻煩,筆者做了個腳本執行,下面就看看腳本里面的代碼(其實就是封裝了幾條命令)
同樣首先在之前桌面的dsym文件夾下創建一個 ips 文件夾,dYSM文件和 .ips 文件拖入進去,Makefile腳本準備好,打開執行,Result.ips文件就出來了,
Makefile.scpt代碼如下:(具體語法這里就不做講解了,用戶名需要替換成自己的用戶名,路徑可以自行根據需要更改)
# 打開終端APP
tell application "Terminal"
# 拼接導出ips結果命令 在此處替換對應的路徑
set pythonOrderStart to "python3 CrashSymbolicator.py"
# 三個路徑的前面的空格不要忽略了
set dSYMPath to " -d /Users/用戶名/Desktop/dsym/ips/Test.app.dSYM"
set outfilePath to " -o /Users/用戶名/Desktop/dsym/ips/Result.ips"
set ipsPath to " -p /Users/用戶名/Desktop/dsym/ips/Test.ips"
set pythonOrderEnd to ";"
# 第一條命令 進入CrashSymbolicator.py對應的文件夾下執行操作 因為CrashSymbolicator.py關聯其它的庫也在這個文件夾內
set order1 to "cd /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources;"
# 第二條命令 分析導出ips結果文件
set order2 to pythonOrderStart & dSYMPath & outfilePath & ipsPath & pythonOrderEnd
# 第三條命令 打開分析的結果文件
set order3 to "open Result.ips"
# 拼接多條命令
set order to order1 & order2 & order3
#多條命令執行用;分割
do script order
end tell