DWARF和DWARF与dSYM文件有什么区别?

时间:2014-03-20 16:44:42

标签: ios xcode

XCode支持此Build Setting的这两个值:

构建设置>构建选项>调试信息格式。

有人可以解释这些差异吗?

5 个答案:

答案 0 :(得分:34)

不同之处在于,对于带有dSYM文件的DWARF,Archive app.xcarchive(用于adHoc分发)还包含在崩溃报告中反向符号化代码所需的dSYM文件。通常,.xcarchive包含

dSyms
Products
info.plist

因此,如果您需要在归档应用程序以进行分发时对崩溃报告进行外部分析,则应将DWARF与dSYM文件一起使用。

答案 1 :(得分:9)

一如既往地了解缩写帮助!

DWARF是一种广泛使用的标准化调试数据格式:

DWARF最初是与Executable and Linkable Format(ELF)一起设计的,尽管它与目标文件格式无关。这个名字是对“ELF”的中世纪幻想补充,没有官方意义。只有(矮人和精灵)都是神话中的生物

Debug Symbol(dSYM):

默认情况下,应用程序的调试版本会在编译的二进制文件中存储调试符号,而应用程序的发布版本会将调试符号存储在随附的dSYM文件中,以减少二进制文件大小。

调试符号文件和应用程序二进制文件通过构建UUID在每个构建基础上绑定在一起。为应用程序的每个构建生成一个新的UUID,并唯一标识该构建。即使从相同的源代码重建功能相同的可执行文件,使用相同的编译器设置,它也将具有不同的构建UUID。

  

例如,如果您有一个库libfoo.dylib,那么调试符号文件   将是libfoo.dylib.dSYM。

     

来自here

故事很长

  • DWARF 只是一个调试文件

  • 带有dSYM文件的DWARF 是一个调试文件以及符号化文件

专业提示:

在我们项目的GitHub回购中,在发布部分我们有类似的内容:

enter image description here

我们手动上传.ipadysm文件,那么如果3个月后用户对我们的10.16版本进行了一次奇怪的崩溃,那么我们将转到此版本分支并使用此版本运行它dsym并试图重现这个问题。

答案 2 :(得分:3)

DWARF 和带有DSYM的 DWARF 都会像在所有其他平台上一样创建DWARF调试信息,但是它们在调试或符号化时将在何处访问调试信息有所不同:< / p>

DWARF 意味着调试信息保留在.o文件中,并且在构建过程中未链接此调试信息。每个.o文件将包含未链接的DWARF,调试器(LLDB,GDB)将在调试时动态链接调试信息。主可执行文件包含符号表中包含的调试映射,该映射具有链接调试信息所需的所有内容。映射包含指向每个.o文件的STABS符号条目,并告诉调试器或链接器所有需要链接的位置(对于函数,全局变量和静态变量)。调试信息由于未链接而效率较低,并且每个.o文件都可以包含在其他.o文件中也可以找到的类型定义,因此,总体调试信息的大小将更大。这对于实现新功能或尝试查找错误的编辑/编译/调试周期最有用。好处是您在构建过程中不必链接调试信息。并非所有解析调试信息的工具都支持此调试信息模式,因此,如果系统上的本地崩溃报告在回溯中不包含源文件和行信息,则可能需要创建dSYM文件。需要解析调试信息的诸如sample,ReportCrash和Instruments之类的工具可能不支持 DWARF 设置。

带有dSYM的DWARF 意味着,在生成可执行文件后,将使用名为dsymutil的工具链接dSYM调试信息文件。链接可执行文件以解析主可执行文件中的调试映射并生成包含所有调试信息的dSYM文件后,dsymutil会运行。如果项目中包含大量代码,则链接调试信息会增加构建时间。所有.o文件中的DWARF调试信息都已智能链接到dSYM文件中。彻底剥离的所有代码都将删除其调试信息,而dsymutil将在调试信息中具有唯一的类型,因此生成的DWARF变得更小,更有效。在构建发行版时,或者如果有一台正在缓存构建供其他人下载的构建计算机时,请使用此设置。

为了找到可执行文件的dSYM文件,将主可执行文件中的UUID复制到dSYM文件中。先前的注释建议,即使使用相同的源代码和编译器,UUID也会随每个版本而变化,但这不是事实。 UUID是二进制部分由于调试信息而不会更改的MD5校验和。调试信息可以包含路径和其他数据,这些路径和其他数据会根据源所在目录的不同而变化。如果UUID只是整个二进制文件的MD5校验和,那么对于使用相同编译器构建的相同源,UUID将会有所不同。内置于/ tmp / myproj与/ users / data / myproj。因此,即使重要项目(__TEXT,__ DATA等)相同,即使项目位于不同目录中,内置于Darwin二进制文件中的UUID也将匹配。这使UUID可以用于生成相同二进制文件的多个构建中的唯一dSYM文件。如果使用SDK头文件或使用不同的编译器或链接器,则UUID可以轻松地不同。

有一个用于dSYM文件的Spotlight导入程序,它知道如何从dSYM文件中提取UUID,以便调试器和其他工具(例如样本,Instruments,ReportCrash等)可以找到二进制文件的dSYM文件,即使dSYM文件在二进制文件旁边不正确。您可以通过运行dwarfdump来查看二进制文件的UUID:

$ dwarfdump --uuid ~/a.out
UUID: E76A2647-AFB4-3950-943A-CB1D701B7C07 (x86_64) ~/a.out

然后,您可以使用系统中的Spotlight窗口搜索dSYM文件。还有一个可以使用的名为“ mdfind”的命令行工具,可以使用:

$ mdfind E76A2647-AFB4-3950-943A-CB1D701B7C07
/Users/admin/a.out.dSYM

总而言之:如果您有大型项目,并且希望避免在日常工作流程中链接dSYM文件花费时间,请使用 DWARF 进行编辑/编译/调试周期。如果您的项目较小,正在执行发行版本,或者需要其他非调试器的Apple工具才能解析调试信息,请始终使用 DWARF和dSYM 。两种格式都包含相同类型的信息,并且可以用于调试,但是并非所有工具都可以加载DWARF保留在.o文件中的 DWARF 格式。

答案 3 :(得分:2)

DWARF(使用属性记录格式进行调试)是许多编译器和调试器使用的调试文件格式,用于支持源级调试。它是目标文件中调试信息的格式。程序的DWARF描述是树结构,其中每个节点可以有子节点或兄弟节点。节点可能代表类型,变量或函数。

  

来源:https://www.ibm.com/developerworks/aix/library/au-dwarf-debug-format/index.html

带有dSYM文件的DWARF存储应用程序的调试符号

像crashlytics这样的服务使用它来用相应的方法名称替换崩溃日志中的符号,这样它就是可读的并且有意义。

  

来源:What's the dSYM and how to use it? (iOS SDK)

答案 4 :(得分:0)

从“项目编辑器帮助”中:

调试信息格式(DEBUG_INFORMATION_FORMAT)

要产生的调试信息的类型。

DWARF:目标文件和链接的产品将使用DWARF作为调试信息格式。矮人

带有dSYM文件的DWARF:目标文件和链接的产品将使用DWARF作为调试信息格式,并且Xcode还将生成一个dSYM文件,其中包含来自各个目标文件的调试信息(除了不需要dSYM文件之外,它将不能为静态库或目标文件产品创建)。矮人与dsym