原文地址:http://www.cimgf.com/2009/12/23/automatically-save-the-dsym-files/
如原作者发现有侵权行为可责令我在24小时之内删除,前提是你能看到。
曾几何时起,用OC编写的应用程序,不管是Mac应用程序还是iOS程序,你在编译的时候弹出来的调试信息都是一堆汇编或者二进制信息。因此在应用程序crash的时候,不像其他语言比如Java,OC很难让我们定位到程序奔溃的原因。然而,殊不知OC程序在编译的时候会生成一个dSYM文件,该文件可以让这些调试信息和我们的奔溃日志相匹配,这样就可以帮助我们更好的定位到crash的位置。
需要注意的是,dSYM文件必须直接和二进制匹配(因为每个Mach-o对象中都内嵌了一个uuid,这个uuid必须和dsym文件中的uuid一一对应,所以重新打包后之前的uuid就不能用了),因此在每次项目打完测试包或者发布包之后都要手动把dSYM文件保存下来,这对于开发者来说很痛苦。
为了解决每次手动保存的问题,我写了一段脚本,每次我构建包之后都会运行这段脚本。这段脚本会把dSYM文件移动到项目中一个同名(dSYM)的目录下。这段脚本还会去检查代码是否提交到git仓库中,并将这个文件也提交到git中,为了解决重名问题,脚本会把文件名更改为当前的日期加时间。
失败检查
脚本做的第一件事是确保它能够被正常的运行。
if [ "$BUILD_STYLE" == "Debug" ]; then
echo "Skipping debug"
exit 0;
fi
第一行表示检查项目的编译模式是否为debug,因为debug模式下打出来的包大多数时候试运行在开发者的设备上,其中包含了很多调试信息,而这些信息都是可以忽略的。
if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then
echo "Skipping simulator build"
exit 0;
fi
第二步检查运行的设备是否为模拟器,如果是的话则不会保存dSYM文件。
移动文件
因为成千上万开发者的项目文件路径是不同的,所以我使用了系统提供的环境变量来定位编译后生成的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}"
下一步就是建立文件夹并移动文件了。我喜欢将文件路径保存在变量里,这样就可以通过控制台将它们打印出来看是路径否出错。
提交到版本控制中
现在应该没有项目是不进行版本控制的吧。
if [ -f ".git/config" ]; then
git add "${RELATIVE_DEST_PATH}"
git commit -m "Added dSYM file for ${BUILD_STYLE} build" \
"${RELATIVE_DEST_PATH}"
fi
最后一部分只有项目在远程仓库中的时候才会执行,脚本会帮你将新建的文件夹提交到git仓库中,并配上一条简单的提交信息。
结论
最近我使用xcode自带的symbolicatecrash工具时遇到了一点问题,但最终我们会解决它的,这些dSYM文件是追踪crash的好东西。
附件中提供了一个文件,我通常会将这个文件加入到项目中,有一段脚本专门去运行文件中的脚本。
Move_dSYM_To_Storage.sh.zip
更新
Reader Rob Elkin给我了一点提示,下面是更新后的脚本,也是我使用的最新版本:
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}
以为现在构建包之后的存储路径改变了(specifically ~/Library/Developer/Xcode/Archives//)
我还将mv指令改变成了cp -r,我更喜欢将原文件复制一份到新的文件夹中,这样对原文件就不会有任何影响。
希望这能帮助到你,也要感谢Rob愿意分享你的想法。