iOS上的崩溃报告工具如何解除发布版本上的崩溃报告?

时间:2016-04-13 12:27:28

标签: ios crash-reports

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

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

1 个答案:

答案 0 :(得分:2)

以下内容适用于OS X,iOS,tvOS以及watchOS:

  1. 如果二进制文件本身包含符号,则它们只能提供类名和方法名。但绝不是文件名或行号。所以他们的好处是有限的,但二进制大小的增加很大,大约30-50%(估计,可以更大或更小,取决于应用程序)
  2. 如果您的构建设置设置正确(默认设置= DEBUG_INFORMATION_FORMAT设置为DWARF with dSYM File),那么无论您何时构建,您还将获得一个dSYM包,其中包含一个包含所有内容的dwarf文件需要象征性地获取文件名和行号。
  3. 那么iTunes Connect,Xcode,Fabric,HockeyApp等实际上如何进行符号化?

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

    他们如何获得堆栈跟踪?

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