xcode DWARF和带dSYM文件的DWARF有什么区别?

bhmjp9jg  于 2023-01-21  发布在  其他
关注(0)|答案(5)|浏览(288)

XCode支持此构建设置的这2个值:
生成设置〉生成选项〉调试信息格式。
有人能解释一下其中的区别吗?

vsnjm48y

vsnjm48y1#

不同之处在于,如果是带有dSYM文件的DWARF,您的归档应用.xcarchive(用于adHoc分发)还包含在崩溃报告中反向符号化代码所需的dSYM文件。

dSyms
Products
info.plist

因此,如果您需要它来对应用程序进行分发存档时的崩溃报告进行外部分析,则应使用DWARF和dSYM文件。

tv6aics1

tv6aics12#

一如既往地理解缩写的帮助!

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

DWARF最初是与Executable and Linkable Format(ELF)沿着设计的,尽管它独立于对象文件格式。这个名字是中世纪对“ELF”的幻想补充,没有正式的含义。只是两者(矮人和精灵)都是神话中的生物

调试符号(dSYM):

默认情况下,应用程序的调试版本将 * 调试符号 * 存储在已编译的二进制文件中,而应用程序的发布版本将调试符号存储在配套的dSYM文件中,以减小二进制文件的大小。
调试符号文件和应用程序二进制文件在每个生成的基础上由生成UUID绑定在一起。为应用程序的每个生成生成生成一个新的UUID,它唯一地标识该生成。即使使用相同的编译器设置从相同的源代码重新生成功能相同的可执行文件,它也将具有不同的生成UUID。
例如,如果您有一个库libfoo.dylib,则调试符号文件将是libfoo. dylib. dSYM。
here开始
长话短说

*DWARF只是调试文件
*带dSYM文件的DWARF是调试文件沿着符号化文件
专业提示:

在我们项目的GitHub repo中,在releases部分,我们有这样的内容:

我们上传了.ipadysm文件,这样如果3个月后用户在我们的10.16版本中发生了奇怪的崩溃,那么我们将转到此发布分支,使用此dsym运行它,并尝试重现该问题。

jvidinwx

jvidinwx3#

DWARFDWARF with dSYM创建DWARF调试信息的方式与所有其它平台类似,但它们在调试或符号化时访问调试信息的位置不同:
DWARF表示调试信息保留在.o文件中,并且在生成过程中不链接此调试信息。每个.o文件将包含未链接的DWARF和调试器(黎巴嫩发展银行,GDB)会在调试时即时链接调试信息。主可执行文件包含一个调试Map,该Map包含在符号表中,符号表中包含链接调试信息所需的一切。Map包含指向每个.o文件的STABS符号项,并告诉调试器或链接器需要链接所有内容的位置(对于函数、全局变量和静态变量)。调试信息的效率将较低,因为它没有链接,并且每个.o文件可以包含在其他.o文件中也可以找到的类型定义,所以调试信息的总量会更大。这通常对实现新特性或试图跟踪bug的编辑/编译/调试周期最有用。好处是您不必在构建过程中链接调试信息。并非所有解析调试信息的工具都支持这种模式的调试信息,因此,如果系统上的本地崩溃报告在回溯中不包含源文件和行信息,则可能需要创建dSYM文件。需要解析调试信息的工具(如sample、ReportCrash和Instruments)可能不支持DWARF设置。
DWARF with dSYM表示在构建可执行文件之后,将使用名为dsymutil的工具链接dSYM调试信息文件。dsymutil在链接可执行文件后运行,以解析主可执行文件中的调试Map,并生成包含所有调试信息的dSYM文件。如果项目中有大量代码,则链接调试信息可能会增加构建时间。所有.o文件中的DWARF调试信息都智能地链接到dSYM文件中。任何已完全剥离的代码都将删除其调试信息,并且dsymutil将删除调试信息中的重复类型,因此生成的DWARF要小得多且更有效。在生成您的发布版本时,或者如果您的生成计算机正在缓存生成版本以供其他人下载,请使用此设置。

为了找到一个可执行文件的dSYM文件,主可执行文件的UUID被复制到dSYM文件中。前面的评论建议,即使使用相同的源代码和编译器,UUID也会随着每次构建而改变,但这是不正确的。UUID是二进制文件中不因调试信息而改变的部分的MD5校验和。调试信息可以包含路径和其他数据,这些数据根据源所在的目录而变化。如果UUID只是整个二进制文件的MD5校验和,那么对于使用相同编译器构建的相同源代码,如果一个源代码是在/tmp/myproj与/users/data/myproj中构建的,则UUID将是不同的。因此,如果重要的位与达尔文二进制代码中内置的UUID匹配,(__文本,__数据,等)是相同的,即使项目是在不同的目录中构建的。这允许UUID用于在产生相同二进制文件的多个构建中唯一的dSYM文件。如果使用SDK头文件或不同的编译器或链接器,UUID很容易不同。
dSYM文件的Spotlight导入器知道如何从dSYM文件中提取UUID,以便调试器和其他工具(如sample、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。如果您有较小的项目,进行发布构建,请始终将DWARF与dSYM一起使用。或者需要其他非调试器的Apple工具才能解析调试信息。这两种格式包含相同类型的信息,可用于调试,但并非所有工具都能加载DWARF格式,其中DWARF保留在.o文件中。

eqqqjvef

eqqqjvef4#

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)

gwbalxhn

gwbalxhn5#

从“项目编辑器帮助”:
调试信息格式(DEBUG_INFORMATION_FORMAT)
要生成的调试信息的类型。
DWARF:目标文件和链接的产品将使用DWARF作为调试信息格式。
带有dSYM文件的DWARF:目标文件和链接产品将使用DWARF作为调试信息格式,Xcode还将生成一个dSYM文件,其中包含来自各个目标文件的调试信息(除了不需要dSYM文件,也不会为静态库或目标文件产品创建dSYM文件)。

相关问题