为啥 Crashlytics 每次都要求丢失 DSYM 文件?

Posted

技术标签:

【中文标题】为啥 Crashlytics 每次都要求丢失 DSYM 文件?【英文标题】:Why Crashlytics is asking for missing DSYM file every time?为什么 Crashlytics 每次都要求丢失 DSYM 文件? 【发布时间】:2018-12-28 15:05:55 【问题描述】:

我在我的应用程序中使用 Crashlytics,一切正常。甚至 Crashlytics 也运行良好。

但问题是,每当我为我们的应用创建新版本 它再次显示丢失的 DSYM 文件上传新。

有什么解决办法吗?

在织物文档中,我找到了这个。但我不明白这一点。

谁能向我解释如何解决这个问题?

https://docs.fabric.io/apple/crashlytics/advanced-setup.html

【问题讨论】:

2020年还在寻找这个问题答案的朋友,请看我这里的答案:***.com/a/61749364/4387347。 【参考方案1】:

我们最近遇到了同样的问题。最后得到了一个上传脚本的定制版本。

if [[ "$CONFIGURATION" = "Release" ]] || [[ "$CONFIGURATION" = "Adhoc" ]]; then
  echo "Uploading dSYMs.."
  find "$DWARF_DSYM_FOLDER_PATH" -name "*.dSYM" | xargs -I \\ "$PODS_ROOT/FirebaseCrashlytics/upload-symbols" -gsp "$SRCROOT/GoogleService-Info.plist" -p ios \\
else
  echo "Skip dSYMs upload"
fi

请注意在调试配置中引用的路径和跳过的 dSYM 上传。虽然大部分时间可能无关紧要,因为无论如何 dSYMS 在调试配置中都已关闭。

find 的目的也是为了帮助上传动态框架的 dSYM 文件。例如。 OS 第三方库、项目框架等。否则,它们将不会被符号化。虽然仍然显示在堆栈跟踪中。

【讨论】:

你是最棒的【参考方案2】:

TL;DR

每次添加一行代码后重新编译项目时,dSYM 都会发生变化,因为生成的二进制文件中的代码行地址不一样。

您可以查看Fabric docs about uploading dsym,通过添加构建阶段或使用 Fabric pod 而不是像 @ekscrypto 所说的那样自动添加构建阶段的 Crashlytics 来自动上传您的 dSYM。

如果您仍想手动执行此操作,请打开您的 xcarchive,您可以在其中找到您的 dSYM 并将它们上传到 crashlytics

更多详情

dSYM 是调试符号的缩写。这有助于 crashlytics 解析它收到的崩溃日志,并有助于显示有关可能发生的崩溃/错误的详细信息。

当您归档您的应用程序时,您会留下 *.xcarchive “文件”,它实际上是一个您可以浏览的文件夹。在这个 xcarchive 中,您应该有一个 dSYM 文件夹,您的 dSYM 就在其中。

要查看它,首先在 XCode 中打开管理器窗口(窗口 > 管理器或 cmd+shift+6),右键单击最后一个存档并单击“在 Finder 中显示”。在打开的 Finder 窗口中,右键单击应用程序的最后一个 xcarchive,然后单击显示内容(抱歉图片是法语的)

这会将您带到您的 xcarchive 中,您可以在其中查看应用的 dSYM

将此上传到 crashlytics 应该可以解决您的问题

【讨论】:

@user3476144 找到 DSYM 并上传不是问题。我能够做到这一点。我的问题是关于每个版本为什么我需要上传 DSYM 文件? 每次添加一行代码后重新编译项目时,dSYM 都会发生变化,因为生成的二进制文件中的代码行地址不一样。您可以查看docs.fabric.io/apple/crashlytics/… 来自动将您的 dSYM 文件上传到 Fabric,或者甚至可以在构建阶段中添加一个脚本阶段来执行此操作 不客气,我根据 cmets 编辑了我的答案,以防有人遇到这个 SO 线程:) 上传此存档不再起作用 - 您必须从 iTunes Connect 上传 dsym。转到 iTunes Connect -> 我的应用程序 -> 活动。选择要上传 dSYM 的版本。下载包含符号下的 dSYM。压缩并上传到 Crashlytics 或 Firebase -> Crashlytics @TaimurAjmal 如何将 dSYM 上传到 Crashlytics?【参考方案3】:

在您的 Xcode 项目中,在 Build Phases 下添加上面的运行脚本:

"$PODS_ROOT/Fabric/upload-symbols" -gsp "$PROJECT_DIR/GoogleService-Info.plist" -p ios "$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME"

【讨论】:

由于 Fabric 现在已弃用,因此脚本已更改。请在此处查看我的答案以获取新脚本:***.com/a/61749364/4387347。【参考方案4】:

简单的步骤如下 1 转到存档并右键单击要在 Firebase 上获取崩溃报告的最新版本 2 查看 dsyms 文件夹 3 创建 dsyms 文件夹的 Zip 文件 4 最后将该zip文件上传到firebase控制台

【讨论】:

【参考方案5】:

此错误表示某些 dSYM 文件丢失。推荐的方法是不断地将 dSYM 文件上传到 Crashlytics。

现在 Crashlytics 已集成在 Firebase 中,文档略有更改:https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports-new-sdk

    集成 Crashlytics:pod 'Firebase/Crashlytics' 添加运行脚本阶段: find "$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME" -name "*.dSYM" | xargs -I \\ $PODS_ROOT/FirebaseCrashlytics/upload-symbols -gsp $SRCROOT/GoogleService-Info.plist -p ios \\

如果您不想在每次调试构建应用时都上传 dSYM 文件:https://support.crashlytics.com/knowledgebase/articles/118559-can-i-make-the-dsym-uploading-only-on-release-buil

【讨论】:

还要确保使用这个符号“而不是” 如何“推荐”手动上传这些文件并尝试一遍又一遍地与源代码同步?这不可能。 通常您会将上传步骤添加到您的分发脚本中,这样您就不必手动进行【参考方案6】:

确保您集成了新的“Fabric”框架,而不仅仅是 Crashlytics 框架。当您这样做时,您将在项目的构建阶段得到一个新脚本。

此脚本将自动找到您的 dSYM 并将其与您的构建一起上传到 Fabric.io/Crashlytics 系统。

【讨论】:

我在构建阶段没有 fabric.io 选项。我将如何得到这个?我只是更新了 pod,但我没有得到这个选项。我正在使用 XCode 9.4 最简单的方法是去集成crashlytics,然后打开Fabric应用,然后点击“+New App”,然后按照指南操作;它应该自动添加必要的脚本阶段。【参考方案7】:

他们又变了:

find dSYM_directory -name "*.dSYM" | xargs -I \\ $PODS_ROOT/FirebaseCrashlytics/upload-symbols -gsp $SRCROOT/GoogleService-Info.plist -p ios \\

检查这里: https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports-new-sdk

【讨论】:

以上是关于为啥 Crashlytics 每次都要求丢失 DSYM 文件?的主要内容,如果未能解决你的问题,请参考以下文章

64位win7为啥每次打开xscan都提示丢失NPPTools.dll

为啥我的IE快捷方式每次开机都要重新创建一次啊!有啥办法使之不丢失

IBM DS4800服务器RAID信息丢失数据恢复方法

Firebase Crashlytics 为 UUID 上传丢失的 dSYMs 文件

在 iOS 9.2 中使用 Crashlytics 缺少 dSYM

为啥记事本每次保存都说该文件含有unicode格式的字符?