xcode 符號化崩潰日誌.crash 或 .ips檔案
經常遇到測試給我們提一個崩潰bug(非必現),然後符一個*.ips檔案,開啟裡面全是記憶體地址,這時候就需要我們把這些地址符號化才能找到問題然後解決問題。對於.crash檔案解決方法和*ips一樣(ps:網上大部分討論的是解決*.crash崩潰日誌,我很納悶,後來發現他們倆是一樣的)。
解決問題之前先確認環境就是解決問題的前提
1.確保自己xcode對應的sdk版本比生成崩潰日誌的測試裝置的sdk版本高(相同也行,這個是因為系統庫模組對應的地址是由手機中的sdk生成的不然這塊記憶體就不能對映成功,只能映射出我們app模組對應的地址資訊)
2.有打包對應的*app檔案和對應的*.app.dSYM檔案,是否對應可以從檔案對應的uuid和日誌中的uuid對應
app檔案的uuid可以通過命令 dwarfdump --uuid YourApp.app/YourApp 生成
日誌中的uuid可以從Binary Images:
0x100014000 - 0x101ccffff XXXX arm64 <28cead2455f83336b0be74c651bdd3d8>
對應的這段內容找出 尖括號中
接著就是展現奇蹟的時刻了。(方法一 xcode7.3symbolicatecrash路徑改為
先執行/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
export DEVELOPER_DIR=`xcode-select --print-path`
定義了一個變數指向xcode的目錄可能下面的命令會用到它,然後執行
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash -v xxxxxxxxxxxxxxx.ips.txt 2>symbollicate.log >sybcontent.log
對應好自己的symbolicatecrash位置,-v是囉嗦模式會把執行命令的日誌放到symbollicate.log 中裡面可能有錯誤啥的對映失敗的話可以看看分析。符號化後的日誌就存在sybcontent.log中這裡面就能看到函式地址對應的函式名
以上方式都是我從stackOverFlower中爬樓總結的。
現在可以簡單地操作了(方法二)
開啟xcode->Device 選中一個裝置例如你的iPhone,點選右側面板view device log ,然後吧*.ips更改為*.crash 然後拖進去,選中你的crash檔案右鍵->ReSymbolicatecrash,如果你的電腦就是打包的電腦那應該就行了,如果不是打包的電腦你需要執行下mdimport YOURFolder 確保你的app 和dSYM檔案在這個資料夾中,對於這個問題我的理解是,xcode查詢自動對映崩潰日誌只會搜尋自己打包的app,二方法一中的symbolicatecrash命令會全盤搜尋你的磁碟,從生成的symbollicate.log檔案中就可以看出來
既然有了簡單粗暴的方法二,方法一還有用嗎,當然有用方法二是apple加了對方法一的封裝,但是symbolicatecrash工具目前是有bug的比如說你裝了多個xcode,命名了xcode 2那你用這個xcode就映射不出來(xcode6.0.1,新版不知道會不會修復這個bug)這時候方法一就起作用了,映射不出來可以看日誌找問題。
還有直接用atos 命令直接根據地址映射出來函式,但是這個沒有檢查庫與日誌裡的庫是否對應也就是說可能給你一個莫名其妙的方法名,方法一方法二最終也會用這個命令解析記憶體地址,但是前提是庫對上的,對不上的它們不會做對映
方法三
如果你打包的時候把*.archive檔案儲存下來(這一點很重要),然後你把雙擊這個檔案會安裝到xcode打包記錄裡(當然如果電腦就是打包電腦就不需要這一步了),直接在裝置crashlog列表裡右鍵resymbolicate
到這裡應該沒問題了,但是bug不一定能解決。。。。
實在還有疑問聯絡我QQ:754427591
方法一詳細講解可以參考https://possiblemobile.com/2015/03/symbolicating-your-ios-crash-reports/