經常遇到測試給我們提一個崩潰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 命令直接根據地址映射出來函數,但是這個沒有檢查庫與日志里的庫是否對應也就是說可能給你一個莫名其妙的方法名,方法一方法二最終也會用這個命令解析內存地址,但是前提是庫對上的,對不上的它們不會做映射
到這里應該沒問題了,但是bug不一定能解決。。。。
方法一詳細講解可以參考https://possiblemobile.com/2015/03/symbolicating-your-ios-crash-reports/