原文地址:http://www.cimgf.com/2009/12/23/automatically-save-the-dsym-files/
如原作者發(fā)現(xiàn)有侵權(quán)行為可責(zé)令我在24小時(shí)之內(nèi)刪除,前提是你能看到。
曾幾何時(shí)起堂竟,用OC編寫的應(yīng)用程序盒发,不管是Mac應(yīng)用程序還是iOS程序缴挖,你在編譯的時(shí)候彈出來的調(diào)試信息都是一堆匯編或者二進(jìn)制信息亲桦。因此在應(yīng)用程序crash的時(shí)候殉摔,不像其他語言比如Java炮车,OC很難讓我們定位到程序奔潰的原因舵变。然而,殊不知OC程序在編譯的時(shí)候會(huì)生成一個(gè)dSYM文件示血,該文件可以讓這些調(diào)試信息和我們的奔潰日志相匹配棋傍,這樣就可以幫助我們更好的定位到crash的位置。
需要注意的是难审,dSYM文件必須直接和二進(jìn)制匹配(因?yàn)槊總€(gè)Mach-o對(duì)象中都內(nèi)嵌了一個(gè)uuid瘫拣,這個(gè)uuid必須和dsym文件中的uuid一一對(duì)應(yīng),所以重新打包后之前的uuid就不能用了)告喊,因此在每次項(xiàng)目打完測(cè)試包或者發(fā)布包之后都要手動(dòng)把dSYM文件保存下來麸拄,這對(duì)于開發(fā)者來說很痛苦。
為了解決每次手動(dòng)保存的問題黔姜,我寫了一段腳本拢切,每次我構(gòu)建包之后都會(huì)運(yùn)行這段腳本。這段腳本會(huì)把dSYM文件移動(dòng)到項(xiàng)目中一個(gè)同名(dSYM)的目錄下秆吵。這段腳本還會(huì)去檢查代碼是否提交到git倉(cāng)庫(kù)中淮椰,并將這個(gè)文件也提交到git中,為了解決重名問題,腳本會(huì)把文件名更改為當(dāng)前的日期加時(shí)間主穗。
失敗檢查
腳本做的第一件事是確保它能夠被正常的運(yùn)行泻拦。
if [ "$BUILD_STYLE" == "Debug" ]; then
echo "Skipping debug"
exit 0;
fi
第一行表示檢查項(xiàng)目的編譯模式是否為debug,因?yàn)閐ebug模式下打出來的包大多數(shù)時(shí)候試運(yùn)行在開發(fā)者的設(shè)備上忽媒,其中包含了很多調(diào)試信息争拐,而這些信息都是可以忽略的。
if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then
echo "Skipping simulator build"
exit 0;
fi
第二步檢查運(yùn)行的設(shè)備是否為模擬器晦雨,如果是的話則不會(huì)保存dSYM文件架曹。
移動(dòng)文件
因?yàn)槌汕先f開發(fā)者的項(xiàng)目文件路徑是不同的,所以我使用了系統(tǒng)提供的環(huán)境變量來定位編譯后生成的dSYM文件位置闹瞧。
SRC_PATH=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}
RELATIVE_DEST_PATH=dSYM/${EXECUTABLE_NAME}.$(date +%Y%m%d%H%M%S).app.dSYM
DEST_PATH=${PROJECT_DIR}/${RELATIVE_DEST_PATH}
echo "moving ${SRC_PATH} to ${DEST_PATH}"
mv "${SRC_PATH}" "${DEST_PATH}"
下一步就是建立文件夾并移動(dòng)文件了绑雄。我喜歡將文件路徑保存在變量里,這樣就可以通過控制臺(tái)將它們打印出來看是路徑否出錯(cuò)夹抗。
提交到版本控制中
現(xiàn)在應(yīng)該沒有項(xiàng)目是不進(jìn)行版本控制的吧绳慎。
if [ -f ".git/config" ]; then
git add "${RELATIVE_DEST_PATH}"
git commit -m "Added dSYM file for ${BUILD_STYLE} build" \
"${RELATIVE_DEST_PATH}"
fi
最后一部分只有項(xiàng)目在遠(yuǎn)程倉(cāng)庫(kù)中的時(shí)候才會(huì)執(zhí)行,腳本會(huì)幫你將新建的文件夾提交到git倉(cāng)庫(kù)中漠烧,并配上一條簡(jiǎn)單的提交信息杏愤。
結(jié)論
最近我使用xcode自帶的symbolicatecrash工具時(shí)遇到了一點(diǎn)問題,但最終我們會(huì)解決它的已脓,這些dSYM文件是追蹤crash的好東西珊楼。
附件中提供了一個(gè)文件,我通常會(huì)將這個(gè)文件加入到項(xiàng)目中度液,有一段腳本專門去運(yùn)行文件中的腳本厕宗。
Move_dSYM_To_Storage.sh.zip
更新
Reader Rob Elkin給我了一點(diǎn)提示,下面是更新后的腳本堕担,也是我使用的最新版本:
echo "starting dsym archiving"
if [ "$BUILD_STYLE" == "Debug" ]; then
echo "Skipping debug"
exit 0;
fi
if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then
echo "Skipping simulator build"
exit 0;
fi
SRC_PATH=${ARCHIVE_DSYMS_PATH}/${DWARF_DSYM_FILE_NAME}
RELATIVE_DEST_PATH=dSYM/${EXECUTABLE_NAME}.$(date +%Y%m%d%H%M%S).app.dSYM
DEST_PATH=${PROJECT_DIR}/${RELATIVE_DEST_PATH}
echo "moving ${SRC_PATH} to ${DEST_PATH}"
cp -r "${SRC_PATH}" "${DEST_PATH}"
if [ -f ".git/config" ]; then
git add "${RELATIVE_DEST_PATH}"
git commit -m "Added dSYM file for ${BUILD_STYLE} build" "${RELATIVE_DEST_PATH}"
fi
主要改動(dòng)的地方在這里:
SRC_PATH=${ARCHIVE_DSYMS_PATH}/${DWARF_DSYM_FILE_NAME}
以為現(xiàn)在構(gòu)建包之后的存儲(chǔ)路徑改變了(specifically ~/Library/Developer/Xcode/Archives//)
我還將mv指令改變成了cp -r已慢,我更喜歡將原文件復(fù)制一份到新的文件夾中,這樣對(duì)原文件就不會(huì)有任何影響霹购。
希望這能幫助到你佑惠,也要感謝Rob愿意分享你的想法。