Xcode 存档中的空 dSYM 文件夹

Posted

技术标签:

【中文标题】Xcode 存档中的空 dSYM 文件夹【英文标题】:Empty dSYM folder in Xcode archive 【发布时间】:2016-07-28 01:39:44 【问题描述】:

我对此进行了广泛的谷歌搜索,有人遇到的情况可能涉及不同的 Xcode 版本(因此不同的构建选项),或者存在 dSYM 文件。

所以,情况就是这样。我通过 Xcode 收到了崩溃报告。它只是内存地址。尝试在项目中打开它会给我相同的内存地址。考虑过手动符号化,但为此我需要与我构建的存档相对应的 dSYM 文件。但是当我为我在 finder 中构建的存档“显示包内容”时,它的 dSYM 文件夹是空的。

存档时我的 Xcode 设置是:

DEBUG_INFORMATION_FORMAT: DWARF with dSYM File

STRIP_INSTALLED_PRODUCT: Yes 切换到No 没有区别。

DEPLOYMENT_POSTPROCESSING: No 切换到Yes 没有区别。

此外,我在将存档上传到 iTunes Connect 时选择了“包含符号”。

与 Apple 的部署过程非常混乱,不必担心当崩溃发生时,报告实际上是可读的!

所以我的问题是:

1) 为什么我的存档缺少 dSYM 文件?

2) 如果已经生成了 dSYM 文件,它会在哪里?

3) 如果我真的没有 dSYM 文件,我还能以某种方式获得人类可读的符号名称吗?我有我上传的原始存档并可以访问该构建的源代码。

3a) 如果我 Product>Archive 再次(并假设这次确实生成了 dSYM),我可以使用这个 dSYM 文件来代替吗?或者它会有不同的 UUID,导致它与崩溃日志不兼容,原因是……嗯……Apple?

Xcode 版本:6.4

这是我在 Xcode Organizer 中的崩溃日志:

谢谢。

编辑:

我在尝试之前升级到 Xcode 7.3,但它也可能适用于版本 6。

问题(1)的解决方法是在项目构建设置中设置如下:

GCC_GENERATE_DEBUGGING_SYMBOLS

【问题讨论】:

【参考方案1】:

在 XCode 8.3.2 上,在 Generate Debug Symbols 上选择 Yes

【讨论】:

【参考方案2】:

对于问题 1),我也不知道。这可能是 Xcode 的一个错误。您可以存档 再次使用相同的代码,然后生成相同的 dSYM 文件。

对于问题2),您可以在文件夹'〜/ Library'中搜索'dSYM',因为'dSYM'文件通常在那里输出。如果找不到,请尝试在整个磁盘中搜索。

对于问题 3),您必须具有崩溃日志在“二进制图像”部分中列出的系统库符号文件。您可以在“~/Library/Developer/Xcode/ios DeviceSupport”中找到它。如果未找到,您可以将具有崩溃日志中显示的相同操作系统版本的 iPhone 连接到 Xcode。 Xcode处理完后,可以将iPhone的系统库符号文件复制到该文件夹​​中。然后,您可以重新符号化崩溃日志。

对于问题 3a),对于相同的应用代码,不同的存档可能有不同的 dSYM 文件(UUID)。如果你用它来符号化崩溃日志,符号化的崩溃线与真实的崩溃线非常接近,所以这也可以帮助你推断崩溃的真正原因。

从您的屏幕截图中,您的应用代码中只有一行未被符号化。现在,您可以通过使用导致崩溃再次存档的应用程序代码生成应用程序的 dSYM 文件。生成 dSYM 文件后,使用命令行dwarfdump -u yourApp.app.dSYM 获取它的 UUID,然后检查 uuid 是否包含在“二进制图像”的第一行中。如果否,您可以将“二进制图像”第一行中的 UUID 修改为与从 dwarfdump -u XXX.dSYM 获得的新 UUID 相同,注意 cpu 架构。完成此操作,您可以在 Xcode 中重新符号化崩溃日志,或者使用命令行symbolicatecrash crashreport.crash yourApp.app.dSYM。请注意,您必须保证您的应用代码的版本与崩溃日志中的版本相同,否则结果令人难以置信。

【讨论】:

关于 (3) 的解决方案,“二进制图像”部分是什么意思?这个部分在哪里?我用崩溃日志的截图编辑了我的问题。我没有看到任何这样的部分。 崩溃日志在 Xcode 崩溃中没有完全显示。标准崩溃日志在here 中解释。如果您想完全符号化崩溃日志,您必须在“二进制图像”部分列出所有符号文件,并且每个文件都用“二进制图像”部分中列出的 UUID 进行标记。现在,如果您已生成代码的 dSYM 文件,则可以完全象征您的崩溃。 我对 xccrashpoint 文件执行了“显示包内容”,然后导航到 3 个 .crash 文件。当我在文本编辑器中打开这些文件时,在“二进制图像”下,只有很长的 .dylib 文件名和以 /System/Library/ 开头的文件名列表。这些我该怎么办?作为此过程的一部分,我是否必须生成 dSYM 文件?您能否详细说明一下。也许给出分步说明?谢谢。 感谢您编辑您的答案。一旦我设法生成 dSYM 文件,我将尝试您为 (3) 建议的步骤。无论构建设置如何,Xcode 似乎都不会生成它。所以基本上,首先需要(1)的答案。 万岁。用你的步骤来象征性地理解它。我已经编辑了我的问题以显示 (1) 的解决方案。然而,符号化文件并没有真正帮助,因为与我的应用程序相对应的唯一行(其余的是系统库方法)读取0x000bc2ca std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() (iosfwd:126)。不是很有帮助。想知道这是否与在崩溃日志中伪造 UUID 或只是 Apple 的堆栈跟踪 非常有帮助有关。

以上是关于Xcode 存档中的空 dSYM 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 如何找到 dSYM 以匹配崩溃文件?

dsym 更多信息显示——

Xcode - UUID 与框架 dSYM 不匹配

为啥我的应用存档中有很多 UUID dsym?

Xcode 3.2.3 不会符号化日志

如何在没有存档但有 .dsym 文件的情况下进行符号化?