什么是 dSYM 文件
Xcode編譯項(xiàng)目后,我們會(huì)看到一個(gè)同名的 dSYM 文件,dSYM 是保存 16 進(jìn)制函數(shù)地址映射信息的中轉(zhuǎn)文件,我們調(diào)試的 symbols 都會(huì)包含在這個(gè)文件中,并且每次編譯項(xiàng)目的時(shí)候都會(huì)生成一個(gè)新的 dSYM 文件,位于 /Users/<用戶名>/Library/Developer/Xcode/Archives 目錄下,對(duì)于每一個(gè)發(fā)布版本我們都很有必要保存對(duì)應(yīng)的 Archives 文件
dSYM 文件有什么作用
當(dāng)我們軟件 release 模式打包或上線后,不會(huì)像我們?cè)?Xcode 中那樣直觀的看到用崩潰的錯(cuò)誤,這個(gè)時(shí)候我們就需要分析 crash report 文件了,iOS 設(shè)備中會(huì)有日志文件保存我們每個(gè)應(yīng)用出錯(cuò)的函數(shù)內(nèi)存地址,通過(guò) Xcode 的 Organizer 可以將 iOS 設(shè)備中的 DeviceLog 導(dǎo)出成 crash 文件,這個(gè)時(shí)候我們就可以通過(guò)出錯(cuò)的函數(shù)地址去查詢 dSYM 文件中程序?qū)?yīng)的函數(shù)名和文件名。大前提是我們需要有軟件版本對(duì)應(yīng)的 dSYM 文件,這也是為什么我們很有必要保存每個(gè)發(fā)布版本的 Archives 文件了。
1.導(dǎo)出crash log
通過(guò)Xcode的Organizer查看某臺(tái)iphone設(shè)備的DeviceLog,選擇需要的crash log,導(dǎo)出XXX.crash文件。
2.找到對(duì)應(yīng)的app文件
找到當(dāng)前iphone設(shè)備上安裝的ipa文件,更改文件后綴名為zip,解壓后得到Payload文件夾,你需要的app文件就在其中了。
3.找到對(duì)應(yīng)build版本的dSYM文件
dSYM文件是iOS編譯后保存16進(jìn)制函數(shù)地址映射信息的文件,每次應(yīng)用程序build后,都會(huì)生成對(duì)應(yīng)的xxx.app, xxx.app.dSYM文件。
如何將文件一一對(duì)應(yīng)
每一個(gè) xx.app 和 xx.app.dSYM 文件都有對(duì)應(yīng)的 UUID,crash(測(cè)試給你的bug日志,也可以是ips文件) 文件也有自己的 UUID,只要這三個(gè)文件的 UUID 一致,我們就可以通過(guò)他們解析出正確的錯(cuò)誤函數(shù)信息了。
1.查看 xx.app 文件的 UUID,terminal 中輸入命令 :
dwarfdump --uuid xx.app/xx (xx代表你的項(xiàng)目名)
2.查看 xx.app.dSYM 文件的 UUID ,在 terminal 中輸入命令:
dwarfdump --uuid xx.app.dSYM
3.crash 文件內(nèi)第一行 Incident Identifier 就是該 crash 文件的 UUID。
開始分析
找到.app文件和.app.dSYM文件
在桌面創(chuàng)建一個(gè)crash文件夾,然后Xcode->Window->Organizer找到Archives找到App->右擊Show in Finder
復(fù)制.app和.app.dSYM到crash夾文件:右擊.xcarchive文件->顯示包內(nèi)容
在dSYMs文件夾中找到.app.dSYM
在Products->Applications文件夾中找到*.app
找到symbolicatecrash
find /Applications/Xcode.app -name symbolicatecrash -type f
- 稍等一會(huì)就會(huì)有路徑輸出,這個(gè)路徑就是symbolicatecrash的路徑
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
- 用命令將symbolicatecrash拷貝到桌面的crash文件夾里面,與.app和.app.dSYM放一起(手動(dòng)找到symbolicatecrash,拷貝出來(lái)也行)
cp /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Users/你的電腦名稱/Desktop/crash
執(zhí)行symbolicatecrash
- 打開終端用命令切換到桌面的crash目錄下:
cd /Users/你的電腦名稱/Desktop/crash
- 執(zhí)行命令
./symbolicatecrash /Users/angelseahappiness/Desktop/crash/Control_2014-01-13-111838_Lynns-iPad3.crash /Users/angel/Desktop/crash/Control.app.dSYM > Control_symbol.crash
- 這時(shí)候終端有可能會(huì)出現(xiàn):
Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
- 輸入命令:
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
- 再執(zhí)行,這時(shí)候終端將會(huì)進(jìn)行處理了
-
將終端完成以后,在crash文件夾里面會(huì)多出一個(gè)文件Control_symbol.crash:這個(gè)就是最終的文件,可以查看bug所在的位置。
結(jié)果.png
