【问题标题】:How does crash reporting tools on iOS desymbolicate the crash reports on a release build?iOS 上的崩溃报告工具如何对发布版本的崩溃报告进行去符号化?
【发布时间】:2016-04-14 00:54:49
【问题描述】:

在 iOS 上,出于安全原因,调试符号已从发布二进制文件中删除。那么像 Fabric、Hockey 等崩溃报告工具如何“去符号化”并显示发布版本中崩溃点的良好堆栈跟踪???

他们是否自行捕获/跟踪崩溃,而不是依赖操作系统生成的跟踪?

【问题讨论】:

  • Fabric 需要上传 dsym 文件,上传后才能象征崩溃日志。
  • 好的。但是发布版本从来没有正确的 dsym 文件,那么它是如何工作的呢?除了像 Hockey 这样的工具还显示了在现场遇到的崩溃的符号化崩溃日志,即在 Beta 测试期间遇到的。作为 Beta 测试人员,我亲身经历了一次崩溃,并且在我没有上传 dSym 的情况下,它显示得很好
  • 发布版本确实有 dsym,我从未使用过 Hockey,但是当您将构建上传到那里的系统时,Fabric 会上传 dsym。
  • 曲棍球也需要 dSYM 进行符号化,即使是发布版本。

标签: ios crash-reports


【解决方案1】:

以下内容适用于 OS X、iOS、tvOS 和 watchOS:

  1. 如果二进制文件本身包含符号,则它们只能提供类名和方法名。但绝不是文件名或行号。所以它们的好处是有限的,但二进制大小的增加很大,大约大 30-50%(估计可能更大或更小,具体取决于应用程序)
  2. 如果您的构建设置设置正确(默认设置 = DEBUG_INFORMATION_FORMAT 设置为 DWARF with dSYM File),那么每次构建时,您还将获得一个 dSYM 包,其中包含一个 dwarf 文件,其中包含符号化和还获取文件名和行号。

那么 iTunes Connect、Xcode、Fabric、HockeyApp 等实际上是如何进行符号化的呢?

他们都在使用 dSYM 包中的 dwarf 文件。他们从堆栈帧中获取内存地址,通过匹配地址范围在崩溃报告的二进制图像部分中找到相应的二进制图像,获取二进制图像的 UUID,找到包含匹配 UUID 的 dSYM 包进行匹配CPU 架构,然后针对它运行像 atos 这样的工具来获取(解构的)符号。

他们如何获得堆栈跟踪?

  1. 操作系统会在进程外生成崩溃报告,供 iTunes Connect 和 Xcode 使用。
  2. 所有第 3 方系统都需要将代码添加到应用程序中,为基于信号的崩溃和未处理的异常设置崩溃处理程序,并在崩溃时尝试安全地获取崩溃报告中所需的所有信息。此代码在应用程序进程中运行,因此可能不会做很多事情(例如,它可能不会在崩溃时分配内存)来安全地收集该数据并且不会破坏任何用户数据或导致设备死锁。第三方系统无法获取系统生成的崩溃报告,因为这些报告位于应用沙箱之外。

【讨论】:

  • 谢谢。非常详细。我假设发布版本不会生成 dsym 文件。但是,如果我将 DEBUG_INFORMATION_FORMAT 设置为 DWARF with dSYM File,则会生成 dSym 文件。但出于安全原因,.ipa 捆绑包最终不包含它。这个假设正确吗?
  • .ipa 不需要 dSYM 并将其作为 .ipa 的一部分,它也将通过 App Store 分发给所有客户,您绝对不希望这样(取决于您的堆栈中这些文件的大小可能 >1GB)。
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2017-04-12
相关资源
最近更新 更多