為了方便愁溜,現(xiàn)在桌面上新建一個名為crash的文件夾罐栈,這樣可以在解析的時候少些一堆路徑。
整體流程如下:
需要準備三個文件:
1)珠十、.app.dSYM(Debug Symbol
) 和 .app(可要可不要)
2)料扰、.crash
3)、symbolicatecrash
把這三個文件放入同一個文件夾焙蹭,命令行執(zhí)行symbolicatecrash解析命令晒杈,就可以得到一個新的new.crash文件,查看這個文件就可以看到崩潰位置孔厉。
1拯钻、如何獲得.app.dSYM和.app文件
自己電腦打的包:
選擇Window --> Organizer --> Archives,選中自己剛打的包撰豺,右鍵粪般,Show in Finder,會看到一個.xcarchive的文件郑趁。
選中.xcarchive刊驴,右鍵姿搜,顯示包內(nèi)容寡润。
在名為dSYMs的文件夾,里面找到.app.dSYM文件舅柜,復制到桌面新建的文件夾下梭纹。
注: 如果項目中使用了很多第三方庫,dSYMs文件夾中還會有很多第三方庫的.dSYM文件(.framework.dSYM)致份。仔細找才能找到我們需要的.app.dSYM文件变抽。
在名為Products文件夾中,點擊進入Applications文件夾氮块,找到.app(可能不帶.app后綴)文件绍载,復制到桌面新建的文件夾下。(其實這個文件在使用symbolicatecrash
解析crash的時候也派不上用場)
問題: 為什么打出來的包沒有找到.app.dSYM
1)滔蝉、在Build Settings中击儡,搜索Debug Information Format
,查看值是否為DWARF with dSYM File
蝠引。
如果選為DWARF則不會產(chǎn)生dSYM文件阳谍,必須選擇DWARF with dSYM File才會生成符號表文件蛀柴。
2)、在Build Settings中矫夯,搜索Generate Debug Symbols
,看一下下面的值是否都為Yes鸽疾,如果為No,則不會生成符號表文件训貌,打出來的包也就找不到.app.dSYM文件制肮。
總之,只有Debug Information Format
為DWARF with dSYM File
且 Generate Debug Symbols
為YES
旺订,這兩個條件同時滿足時弄企,才能生成.app.dYSM文件。
xcode打出去的包默認是release包区拳,如果你把打出去的包改為了debug包拘领,那么Debug Information Format
里的debug
項也要改為DWARF with dSYM File
。
2樱调、如何獲得.crash文件
手機插線連上Xcode约素,選擇Window --> Devices and Simulators
選擇對應(yīng)的app,點擊View Device Logs笆凌,如果很久沒看過這個信息圣猎,打開后還要讀取好久才能完全讀完。
直接插線運行乞而,出現(xiàn)的崩潰在這里是看不到的送悔,只有殺掉app,從手機桌面點擊icon啟動之后的崩潰爪模,才能在這里看見
找到最新的崩潰日志欠啤,右鍵,選擇Export Log屋灌,導出.crash文件到桌面即可洁段。
3、如何獲得symbolicatecrash
可能不同版本Xcode或者mac系統(tǒng)不同共郭,symbolicatecrash所在文件夾也不一樣祠丝,不能用別人提供的路徑去找,比如/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash除嘹,這是往上被人提供的路徑写半,里面根本就沒有symbolicatecrash。
一定要使用如下命令去找尉咕,這才是本機symbolicatecrash所在的有效路徑叠蝇。
在終端輸入以下命令:
find /Applications/Xcode.app -name symbolicatecrash -type f
執(zhí)行結(jié)果如下:
可以看到有多個路徑,我們直接取最后一個就行龙考,路徑為:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
然后右鍵finder蟆肆,選擇前往文件夾...
矾睦,輸入這個路徑就可以。
也可以自己選中Xcode炎功,右鍵顯示包內(nèi)容
枚冗,一層一層的順著文件夾層級去找。
4蛇损、解析crash
在桌面上新建一個文件夾赁温,把.app文件、.app.dSYM文件淤齐、.crash文件股囊、symbolicatecrash工具,一起放到新建的文件夾下更啄,如圖:
1)稚疹、校驗崩潰日志是否與dSYM文件匹配
獲取dSYM文件對應(yīng)的UUID:
$ dwarfdump —u 文件路徑/xxx.app.dSYM
或者
$ dwarfdump --uuid xxx.app.dSYM
獲取崩潰日志的UUID:
打開崩潰日志,全局搜索Binary Images祭务,獲取到如下:
可以看到兩個UUID是相同的内狗。
2)、執(zhí)行symbolicatecrash
打開命令行义锥,cd到新建的crash目錄下柳沙,執(zhí)行命令:
./symbolicatecrash JCrashDemo.crash JCrashDemo.app.dSYM > new.crash
報錯: Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
需要設(shè)置一下導出的環(huán)境變量:
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
設(shè)置完環(huán)境變量之后,再執(zhí)行上面的symbolicatecrash
解析命令拌倍,就ok了赂鲤,在crash目錄下就會看到一個new.crash的解析好的文件了。如圖:
可以看到ViewController.swift
這個文件的28行btnClicked(_:)
這個方法里產(chǎn)生了崩潰柱恤。
問題:
確定.dSYM和.crash文件的UUID相同后数初,執(zhí)行解析命令,我們可以看到生成了new.crash文件膨更,但是終端有個報錯: No symbolic information found
妙真。
錯誤原因1: .crash文件和.dSYM文件的uuid沒對上缴允。
錯誤原因2: 未知荚守。(難道是原crash文件已經(jīng)符號化過了,不需要再次符號好练般,所以報錯?)
這時候查看原crash文件和新生成的crash文件矗漾,發(fā)現(xiàn)內(nèi)容是一模一樣的,而且兩個文件里的內(nèi)容都是符號化好了的薄料。
注意:
只要手機上的應(yīng)用是這臺電腦安裝打包的敞贡,這樣的崩潰信息系統(tǒng)已經(jīng)為我們符號化好了,如果還是沒有符號化完畢 摄职,我們選擇文件誊役,然后右擊選擇Re-Symbolicate就可以(這種情況沒有必要再去手動符號化了)获列。
如果是被人安裝了你電腦打的包,崩潰后直接給你發(fā)了一個.crash文件蛔垢,讓你看一下問題击孩。或者是別人電腦打的包鹏漆,你安裝了產(chǎn)生崩潰巩梢,再自己通過Xcode導出crash,這種情況下crash的crash是沒有經(jīng)過符號化的艺玲,所以就要你自己去符號化了括蝠。
補充
1)、同一個ipa包饭聚,不管產(chǎn)生多少個.crash文件忌警,這些.crash文件的UUID都是同一個,即和這個.ipa對應(yīng)的.app.dSYM文件的UUID相同秒梳。
2)慨蓝、插線運行時產(chǎn)生的崩潰,系統(tǒng)是不會記錄的端幼,也就是說View Device Logs
里沒有記錄礼烈。只有從桌面重新點擊icon啟動后產(chǎn)生的崩潰才能看到。
插線運行的情況下婆跑,如果每次運行是代碼都和上一次一模一樣此熬,那么點擊桌面icon啟動后產(chǎn)生的crash的UUID都是相同的。如果下次運行時的代碼和上次有差別滑进,哪怕只是多加了一行空格犀忱,那么兩次產(chǎn)生的crash的UUID也不同。
3)扶关、自己些demo測試時: 要想.crash文件和.app.dSYM文件的UUID相同阴汇,必須要導出.ipa包,再用手機安裝這個包节槐。也就是說產(chǎn)生crash的包和獲取.app.dSYM的包必須是同一個搀庶。(所以不能插線運行之后產(chǎn)生.crash文件后,然后重新打個一模一樣的包出來铜异,再去找.app.dSYM文件哥倔,兩者的UUID是無法匹配的。)
每次構(gòu)建時都會生成新的唯一的能夠標識那次構(gòu)建的UUID揍庄,即便你用同樣的源代碼咆蒿,通過同樣的編譯setting,UUID也不會相同。相應(yīng)的沃测,dSYM文件也不能用于解析其它(UUID對應(yīng)的)binary信息缭黔,即便構(gòu)建自于同一個源代碼。
也就是說:你必須保存你最開始上傳到App Store的發(fā)生crash的app的歸檔文件蒂破。dSYM文件和app二進制文件是一一對應(yīng)试浙,且每次構(gòu)建都不相同。即便通過相同的源碼和配置寞蚌,再執(zhí)行一次構(gòu)建田巴,生成的dSYM文件也無法和之前的crash report做符號化匹配。 如果你不在存有這個歸檔文件挟秤,你應(yīng)該重新提交一次有歸檔的新版本壹哺,以確保再發(fā)生crash的時候你可以符號化crash report。
4)艘刚、在尚未點擊Distribute App
導出.ipa包前或者導出.ipa包時沒有勾選Rebuild from Bitcode
管宵,dSYM文件夾下只有一個.app.dSYM文件。
如果在導出.ipa包時攀甚,勾選了Rebuild from Bitcode
箩朴,那么dSYM文件夾下就會多出很多個.dSYM文件,如圖:
這些多出來的.dSYM文件的名稱秋度,就是這個.dSYM文件的uuid炸庞。它們和.app.dSYM這個主文件的uuid都不相同。
獲取dSYM文件的幾種方式荚斯。
方法一:
見上文 1埠居、如何獲得.app.dSYM和.app文件
方法二: (適用于已經(jīng)上傳到App Store的包)
在Archives organizer,選擇你之前提交到App Store的Archive文件
選擇Download dSYM按鈕Archive
Xcode會下載dSYM文件并且把他們插入到選擇的Archive中事期。這時候再按照方法一去取出來dSYM文件就行了滥壕。
方法三: (適用于已經(jīng)上傳到App Store的包)
自己進入app管理后臺,點擊TestFlight(以前是Activity)兽泣,找到你想要的構(gòu)建版本绎橘,點擊進入,選擇構(gòu)建版本元數(shù)據(jù)唠倦,點擊下載dSYM称鳞。
因為一般都會開啟bitcode,所以下載的dSYM是一個zip包牵敷。
寫在最后:
可參考文章: https://juejin.cn/post/6844903774780145678