如何自动保存DSYM文件

作者: tongxyj | 来源:发表于2017-10-18 10:20 被阅读49次

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

    相关文章

      网友评论

        本文标题:如何自动保存DSYM文件

        本文链接:https://www.haomeiwen.com/subject/cpvduxtx.html