DWARF调试信息文件的diff工具

DWARF diff tool for debug info file

本文关键字:diff 工具 文件 调试 信息 DWARF      更新时间:2023-10-16

我有一个没有调试符号的二进制文件,它有10mb大,但是有了调试符号,它有100mb大。在正常的开发周期中,我通过一个非常慢的链接重复复制几个100 MB的二进制文件(带有调试符号)。我正在努力减少我需要发送的信息量,以加快传输速度。

我已经研究了二进制diff工具,如bsdiff和courgette,但是考虑到二进制文件的大小和我希望能够传输它的频率,它们所占用的时间和内存对我来说是令人望而却步的。正如响应中所指出的,有一些方法可以缓解需要将调试信息发送到远程主机的问题。gdbserver在我的用例中不起作用,因为我们还希望应用程序能够用符号记录回溯信息。考虑使用PC值和addr2line,但是如果在远程机器上进行测试的同时试图向前推进,那么保留源二进制文件可能会令人困惑。此外,对于多个开发人员,访问其他开发人员机器上的调试信息并不总是那么容易。

strip可以从调试信息中分离出二进制文件,所以我想知道是否有工具来比较和"diff"两个调试信息文件,因为这是我95%的空间所在?在迭代之间,调试信息文件中的许多原始内容是相同的(即名称和关系,这在c++中是令人痛苦的冗长)。

使用user657267的建议,我还研究了使用-gsplit-dwarf来分离.dwo文件。这可能会起作用,但我担心的是,随着时间的推移,核心头将发生变化,并导致每个.dwo文件的微小变化,所以我最终会传输一切,假设我的"基础"保持不变,即使.dwo文件的大部分内容不变。这可能会以有趣的方式解决(例如.dwo文件的存储库),但如果可能的话,我想避免它。

那么,假设我有一个来自以前编译的DWARF调试信息文件,有没有办法将它与来自当前编译的DWARF调试信息文件进行比较,并获得更小的东西来传输?

作为最后的手段,我可以编写某种类型的查找和翻译代码。但是是否有方便的工具来查看、修改和"取消"DWARF调试信息文件呢?我找到了像pyelftools和DWARF实用程序这样的工具。前者只读取die,对我来说太慢了,而后者不能很好地与c++一起工作,我仍在研究从最新的源代码构建它。

沿着这些思路,我研究了dwz工具在这里宣布正在做什么,看看是否可以调整以从已经存在(但过时)的调试信息文件中借用die。在这个方向上的任何提示、文档或伪代码也会有所帮助。

在正常的开发周期中,我必须通过非常慢的链接一遍又一遍地复制我的几个100 MB二进制文件(带有调试符号)。

需要吗?

您的用例要求使用远程调试,其中所有调试信息都保留在开发系统中,并且您只需必须将剥离的二进制文件传输到目标。

关于使用gdbserver的信息在这里。

如果因为某些原因你不能使用gdbserver

从这个链接gcc.gnu.org/wiki/DebugFission,我仍然不明白如何有一个单独的矮人文件将帮助我更容易?

使用单独的调试信息,在通常的编译/调试周期中,您将只重新编译几个文件,并重新链接最终的二进制文件。

这意味着大多数.o.dwo文件将不会被重建,这意味着你不必重新发送未更改的.dwo文件到目标,即你得到增量调试信息更新"免费"。

更新:

我们还使用调试符号来为运行中的应用程序中的异常生成回溯。我认为在本地使用符号是该用例的唯一选择。

只有当你坚持用file/line info完全符号化反向跟踪时。

通常的处理方法是让回溯只包含PC值(可能还有函数名),并在必要时在开发系统上使用addr2line来恢复文件/行信息。