如何自動保存DSYM文件

原文地址: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愿意分享你的想法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 什么是符號表? 符號表是內(nèi)存地址與函數(shù)名、文件名、行號的映射表。符號表元素如下所示: <起始地址> <結(jié)束地址> ...
    深圳陽光閱讀 12,456評論 28 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評論 25 709
  • 你可曾看過: 云追月 影逐日 風(fēng)撼樹 蝶戀花 魚游水 鳥銜枝
    弄花魚沉閱讀 140評論 0 0
  • 晚上放學(xué)路上還好端端的,回到家閨女突然說肚子疼,我忙著在廚房做飯,也沒有空搭理她,心想不會是她無病呻吟吧? 正好她...
    邱Q糖閱讀 581評論 0 1

友情鏈接更多精彩內(nèi)容