先上文件,這里放上 dsym 文件夾的鏈接捻艳,可以自己下載放到桌面上腳本打開執(zhí)行先試一試驾窟,crash文件夾可以直接使用,ips 文件夾需要修改腳本里面的路徑认轨。如有錯誤請幫忙指出,謝謝嘁字!轉(zhuǎn)載請注明出處,喜歡的話衷恭,請點(diǎn)個贊吧!
github
百度網(wǎng)盤 碼 ona1
誠通網(wǎng)盤 碼 7701
1.什么是dSYM文件
dSYM 文件是Xcode編譯后纯续,我們會看到一個同名的 dSYM 文件随珠,dSYM 是保存 16 進(jìn)制函數(shù)地址映射信息的中轉(zhuǎn)文件,存儲應(yīng)用程序的調(diào)試 symbols茸歧。每次編譯項目或者打包的時候都會生成一個新的 dSYM 文件,當(dāng)我們軟件release模式打包或上線后显沈,不會像我們在Xcode中那樣直觀的看到用崩潰的錯誤软瞎,所以對于每一個發(fā)布版本我們都很有必要保存對應(yīng)的 Archives 文件构罗。不管你集沒集成類似Buyly的三方智玻,要符號化分析crash日志還是得要用到對應(yīng)的dSYM文件,如果沒有生成dSYM文件吊奢,可以看一下TARGETS下Build Settings里面有沒有設(shè)置,如下圖召边,文章可能有點(diǎn)啰嗦隧熙,請耐心瀏覽幻林。
2.什么時候會用到dSYM文件
1、APP提交審核躏敢,有閃退bug被拒整葡,審核人員基本會上傳crash文件給你,這時候就要自己符號化分析了啼器。
2俱萍、你們編譯給測試同事的包,如果你們關(guān)系好更哄,大概率會重現(xiàn)一遍給你看,不然可能就是導(dǎo)出一個ips文件直接丟給你了成翩,也可能還有一些不太好復(fù)現(xiàn)的crash麻敌。
3、自己有時候調(diào)試的時候可能會用到术羔。
注:ips文件和crash文件不一樣,Xcode13释移,iOS15以前設(shè)備ips文件改后綴成crash好像可以寥殖,但是之后 Apple 對符號化文件格式進(jìn)行了 JSON 支持, 所以針對 iOS 15 以上產(chǎn)生的崩潰文件, 寫入方式應(yīng)該是做了調(diào)整, 所以在對 iOS 15 以上崩潰文件進(jìn)行符號化時, ips改后綴會出現(xiàn)符號化失敗, 報錯 No crash report version in file 的問題,改為直接使用 CrashSymbolicator.py下面會講到熏纯。
注:如果是發(fā)布Testflight版本粤策,有些公司APP更新前會先提交Testflight版本公測一下,然后很多crash的日志可以通過Apple Store Connect里面對應(yīng)的應(yīng)用叮盘,Testflight下的反饋崩潰里面看到熊户,可以直接Xcode打開,直接到Window->Organize->Crashes下直觀看到崩潰錯誤
3.dSYM嚷堡,ips,crash文件怎么拿到
1串塑、dSYM
編譯后Xcode13以前應(yīng)該在項目的Products文件夾下北苟,右鍵Show in Finder。
Xcode13后位于(/Users/用戶名/Library/Developer/Xcode/DerivedData/對應(yīng)的應(yīng)用程序/Build/Products/Debug-iphoneos)傻昙。
打包的話位于(/Users/用戶名/Library/Developer/Xcode/Archives)目錄下闺骚,也可以在Xcode選擇Window->Organize->Archives妆档,Show in Finder贾惦。
2、crash
手機(jī)插上電腦Xcode選擇Window->Devices and Simulators须板,找到對應(yīng)的iphone,View Device Logs绪颖,右鍵Export Log杰刽。
3王滤、ips
可能是測試同事可能其它同事可能用戶,手機(jī)不能連接到電腦第喳,可以在手機(jī)設(shè)置->隱私->分析與改進(jìn)->分析數(shù)據(jù)踱稍,可以搜索對應(yīng)的.ips.sycned文件然后查看導(dǎo)出修改成.ips的后綴就行,如果不是一眼能看到就直接搜項目名字扩淀。
4.具體怎么利用dSYM符號化分析
注:dSYM文件要和crash啤挎,ips等文件一一對應(yīng),否則符號化會失敗胜臊,比如你1.0.1產(chǎn)生的crash伙判,ips文件要和1.0.1編譯的dSYM文件匹配,注意每次編譯都會生成新的dSYM文件
1勒魔、怎么查看dSYM和ips,crash文件是否一一對應(yīng)
筆者創(chuàng)建的項目叫Test危虱,查看crash唐全,ips直接雙擊打開查看,在下面例子圖有標(biāo)記弥雹,dSYM使用終端命令查看如下延届,Test.app.dSYM修改為對應(yīng)的就行
dwarfdump --uuid Test.app.dSYM
例子如下,終端顯示的是符號 - 拼接的厕吉,crash和ips文件都是連起來的械念。
2龄减、利用symbolicatecrash符號化分析crash文件
注:創(chuàng)建文件夾和文件夾放在哪都能自己看著辦只要用到對應(yīng)文件路徑的時候,路徑能對應(yīng)就可以了烁巫,以下是筆者自己創(chuàng)建的方式宠能。
首先在桌面創(chuàng)建一個dsym文件夾违崇,里面再創(chuàng)建一個crash文件夾,dYSM文件和.crash文件拖入進(jìn)去恤浪,symbolicatecrash復(fù)制進(jìn)去(如果不復(fù)制工具出來肴楷,可以把文件復(fù)制到工具文件夾下執(zhí)行命令),Result.crash是符號化分析后的產(chǎn)物砂客,Makefile是一個用AppleScript寫的一個腳本,打開執(zhí)行就能得到Result.crash(前提里面寫的一些路徑得一一對應(yīng))媚创,還可以保存成一個應(yīng)用程序雙擊打開執(zhí)行彤恶,具體更多好玩的得自己去了解一下。symbolicatecrash工具存放在該路徑下:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources
如果不一樣可能是Xcode名字不一樣芒炼?可以利用下面的命令去查找术徊,如過你的Xcode就叫Xcode話,不然改成自己Xcode路徑:
find /Applications/Xcode.app -name symbolicatecrash -type f
當(dāng)三個文件都在同一個文件夾下后子寓,我們可以通過命令來得到符號化分析后的crash文件笋除,依次執(zhí)行,命令如下:注:如果不執(zhí)行第二條命令會有意想不到的結(jié)果
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命令定位問題
其實(shí)除了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
得到的結(jié)果如上掉瞳,沒錯就是最后異成孪埃回溯的第5行址愿,有沒有發(fā)現(xiàn)偏移后的地址和第6行的第一個地址是一致的,所以第1個地址是開始地址损合,第2個地址是基地址,第3個 + 22788就是偏移量 這是十進(jìn)制的嫁审,計算如下 0x1026b4000 + 0x000005904(22788轉(zhuǎn)16進(jìn)制后的值)= 0x1026B9904 直接百度16進(jìn)制加減法律适,大佬可以除外
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
但是這回不能像復(fù)制symbolicatecrash工具一樣復(fù)制出來了德召,因為這個腳本import其它文件也在同一個目錄下汽纤,我們可以終端命令進(jìn)入到這個文件夾下把 dSYM 文件和 ips 文件放入到該文件夾下執(zhí)行符號化解析命令。
下面先看兩個文件的對比肴掷。
CrashSymbolicator.py 操作稍微和 symbolicatecrash 會有些不同,因為是用 python 寫的腳本径玖,所以要使用 python3 來進(jìn)行調(diào)用梳星,否則會報錯。(肯定有一大波人默默的在終端輸入python查看版本號發(fā)現(xiàn)還是2.7左右的版本冤灾,內(nèi)心一頓XXX,其實(shí)python3早已經(jīng)安裝了匿垄,不信你們終端直接輸入python3試試,如果沒有那得自己安裝了……)
python3 CrashSymbolicator.py -d /xxx.app.dSYM -o /xxx.crash -p /xxx.ips
-d '符號表路徑' -o '輸出符號化路徑' -p '蘋果給的崩潰日志'
如果是在 CrashSymbolicator.py 文件夾下操作吞杭,dSYM 和 ips 文件需要復(fù)制到該腳本文件夾下变丧,命令如下:
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腳本快速進(jìn)行符號化分析
上述在文件夾里面執(zhí)行命令雖然可以完成,但是比較麻煩童擎,筆者做了個腳本執(zhí)行攻晒,下面就看看腳本里面的代碼(其實(shí)就是封裝了幾條命令)
同樣首先在之前桌面的dsym文件夾下創(chuàng)建一個 ips 文件夾,dYSM文件和 .ips 文件拖入進(jìn)去芯砸,Makefile腳本準(zhǔn)備好给梅,打開執(zhí)行,Result.ips文件就出來了包帚,
Makefile.scpt代碼如下:(具體語法這里就不做講解了运吓,用戶名需要替換成自己的用戶名,路徑可以自行根據(jù)需要更改)
# 打開終端APP
tell application "Terminal"
# 拼接導(dǎo)出ips結(jié)果命令 在此處替換對應(yīng)的路徑
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 ";"
# 第一條命令 進(jìn)入CrashSymbolicator.py對應(yīng)的文件夾下執(zhí)行操作 因為CrashSymbolicator.py關(guān)聯(lián)其它的庫也在這個文件夾內(nèi)
set order1 to "cd /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources;"
# 第二條命令 分析導(dǎo)出ips結(jié)果文件
set order2 to pythonOrderStart & dSYMPath & outfilePath & ipsPath & pythonOrderEnd
# 第三條命令 打開分析的結(jié)果文件
set order3 to "open Result.ips"
# 拼接多條命令
set order to order1 & order2 & order3
#多條命令執(zhí)行用谋梭;分割
do script order
end tell