用于调试信息文件的DWARF diff工具

时间:2014-06-01 22:19:28

标签: c++ linux gcc gdb g++

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

我已经研究过像bsdiffcourgette这样的二元差异工具,但考虑到二进制文件的大小和我喜欢的频率,它们所用的时间和内存对我来说太高了能够转移它。正如响应中指出的那样,有一些方法可以缓解需要将调试信息发送到远程主机的问题。 gdbserver在我的用例中无法工作,因为我们还希望应用程序能够使用符号记录回溯信息。考虑使用PC值和addr2line,但如果尝试在远程计算机上进行测试时尝试前进,则保留源二进制文件可能会造成混淆。此外,对于多个开发人员来说,在其他开发人员的计算机上访问调试信息并不容易。

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

使用来自user657267的建议我还调查了使用-gsplit-dwarf分隔.dwo个文件。这可能会有效,但我担心的是,随着时间的推移,核心标题会发生变化并导致每个.dwo文件发生微小的变化,因此无论如何我都会最终转移所有内容,假设我的基数为"即使.dwo文件的大部分内容未更改,也保持不变。这可能会以有趣的方式解决(例如.dwo文件的存储库),但如果可能的话,我希望避免使用它。

所以,假设我有一个以前编译的DWARF调试信息文件,有没有办法将它与当前编译中的DWARF调试信息文件进行比较,并获得更小的传输? < / p>

作为绝对的最后手段,我可​​以编写某种类型的查找和翻译代码。但是有没有方便的工具来查看,修改,然后“不修改”#34;一个DWARF调试信息文件?我找到了pyelftoolsDWARF utilities等工具。前者只读取DIE,在我的情况下读得太慢,而后者在C ++中不能很好地工作,我仍在调查从最新来源构建它。

在这些方面,我已经研究了dwz工具announced here正在做什么,看看是否可以调整是否可以从已经存在的(但过时的)调试信息文件中借用DIE。这方面的任何提示,文档或伪代码也会有所帮助。

1 个答案:

答案 0 :(得分:1)

  

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

必须吗?

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

有关使用gdbserver的信息是here

如果由于某种原因您无法使用gdbserver ...

  

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

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

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

更新

  

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

仅当您坚持使用文件/行信息完全符号化后退跟踪时。

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