程序員定位bug的方式千千萬,這是其中一種。
測試在測試中,客戶在使用中難免會遇到各種各樣的bug崩潰,此時找到你,就需要能夠定位bug位置,并解決bug。
首先我們需要準備兩個個文件,appName.app. dSYM、.crash并將他們放在同一個文件夾下。
appName.app. dSYM
這個文件分兩種情況:
1.Xcode直接打包安裝到手機
可以如下圖所示直接右擊并點擊Show in Finder,在同目錄下尋找.dSYM文件。
如果沒有.dSYM文件,很有可能是Debug下沒有生成.dSYM。可以在Buid Setting中打開該選項。
2.利用.ipa安裝(包括appStore、hoc證書分發)
可以在Xcode->Window-Organizer中找到當時打包的. xcarchive文件,然后右擊Show In Finder,找到文件后右擊顯示包內容,然后在里面找到appName.app. dSYM文件。
.crash
可以直接連接手機,打開Xcode->Window->Devide and Simulators,然后選擇對應的Device,并點擊View Device Logs,根據時間點選擇對應的crash文件。
開始符號化
1.將兩個文件放入同一個文件夾中后,打開終端并cd到對應文件夾下
2.查看DSYM文件UUID
dwarfdump --uuid appName.app.dSYM
//輸出結果:UUID: ECCA19DE-145B-3F22-BA41-6252F7570BFB (arm64) appName.app.dSYM/Contents/Resources/DWARF/appName
3.查看.crash UUID,利用Sublime Text等工具直接打開.crash文件,滾動到Binary Images:位置后,<ecca19de145b3f22ba416252f7570bfb>這個就是.crash的UUID,兩個UUID必須完全一致,否則將無法正確符號化。
0x1004f0000 - 0x101943fff appName arm64 <ecca19de145b3f22ba416252f7570bfb> /var/containers/Bundle/Application/7465D6C7-DBD9-458B-9B25-3BE599C09AF8/appName.app/appName
3.分析.crash文件
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libswiftCore.dylib 0x00000001cb264b00 specialized _fatalErrorMessage+ 2112256 (_:_:file:line:flags:) + 296
1 libswiftCore.dylib 0x00000001cb264b00 specialized _fatalErrorMessage+ 2112256 (_:_:file:line:flags:) + 296
2 libswiftCore.dylib 0x00000001cb070524 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds+ 62756 (_:wasNativeTypeChecked:) + 232
3 libswiftCore.dylib 0x00000001cb073510 Array.subscript.getter + 84
4 appName 0x00000001005feba0 0x1004f0000 + 1108896
5 appName 0x00000001005fcc88 0x1004f0000 + 1100936
6 appName 0x00000001005fce84 0x1004f0000 + 1101444
7 UIKitCore 0x00000001c9f180f0 -[UIApplication
可以看到是Thread 0 Crashed
3.執行如下命令,然后在換行處輸入:0x00000001005feba0(這個根據上面分析.crash文件獲得的具體地址)
arm64是架構 ,appName是app文件,0x1004f0000是基地址
xcrun atos -o appName.app.dSYM/Contents/Resources/DWARF/appName -l 0x1004f0000 -arch arm64
終端輸出:
AppDelegate.updateRootViewController() (in ) (AppDelegate.swift:104)
此時此刻,定位到了bug具體的位置,如果沒定位成功可以繼續選擇其他的地址試試看。。。。