原文地址: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í)候會生成一個(gè)dSYM文件,該文件可以讓這些調(diào)試信息和我們的奔潰日志相匹配,這樣就可以幫助我們更好的定位到crash的位置。
需要注意的是,dSYM文件必須直接和二進(jìn)制匹配(因?yàn)槊總€(gè)Mach-o對象中都內(nèi)嵌了一個(gè)uuid,這個(gè)uuid必須和dsym文件中的uuid一一對應(yīng),所以重新打包后之前的uuid就不能用了),因此在每次項(xiàng)目打完測試包或者發(fā)布包之后都要手動把dSYM文件保存下來,這對于開發(fā)者來說很痛苦。
為了解決每次手動保存的問題,我寫了一段腳本,每次我構(gòu)建包之后都會運(yùn)行這段腳本。這段腳本會把dSYM文件移動到項(xiàng)目中一個(gè)同名(dSYM)的目錄下。這段腳本還會去檢查代碼是否提交到git倉庫中,并將這個(gè)文件也提交到git中,為了解決重名問題,腳本會把文件名更改為當(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è)備是否為模擬器,如果是的話則不會保存dSYM文件。
移動文件
因?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}"
下一步就是建立文件夾并移動文件了。我喜歡將文件路徑保存在變量里,這樣就可以通過控制臺將它們打印出來看是路徑否出錯。
提交到版本控制中
現(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)程倉庫中的時(shí)候才會執(zhí)行,腳本會幫你將新建的文件夾提交到git倉庫中,并配上一條簡單的提交信息。
結(jié)論
最近我使用xcode自帶的symbolicatecrash工具時(shí)遇到了一點(diǎn)問題,但最終我們會解決它的,這些dSYM文件是追蹤crash的好東西。
附件中提供了一個(gè)文件,我通常會將這個(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
主要改動的地方在這里:
SRC_PATH=${ARCHIVE_DSYMS_PATH}/${DWARF_DSYM_FILE_NAME}
以為現(xiàn)在構(gòu)建包之后的存儲路徑改變了(specifically ~/Library/Developer/Xcode/Archives//)
我還將mv指令改變成了cp -r,我更喜歡將原文件復(fù)制一份到新的文件夾中,這樣對原文件就不會有任何影響。
希望這能幫助到你,也要感謝Rob愿意分享你的想法。