【发布时间】:2014-06-01 22:19:28
【问题描述】:
我有一个没有调试符号的 10 MB 大的二进制文件,但带有调试符号的二进制文件有 100 MB 大。在正常的开发周期中,我通过一个非常慢的链接反复复制几个 100 MB 的二进制文件(带有调试符号)。我正在尽量减少需要发送的信息量以加快传输速度。
我研究过像 bsdiff 和 courgette 这样的二进制差异工具,但是考虑到二进制文件的大小和我希望能够传输它的频率,它们所花费的时间和内存对我来说是令人望而却步的。正如回复中所指出的,有一些方法可以缓解需要将调试信息发送到远程主机的问题。 gdbserver 在我的用例中不起作用,因为我们还希望应用程序能够使用符号记录回溯信息。考虑使用PC 值和addr2line,但如果在远程机器上测试的同时尝试取得进展,保留源二进制文件可能会令人困惑。此外,对于多个开发人员,访问其他开发人员计算机上的调试信息并不总是那么容易。
strip 可以从调试信息中分离出二进制文件,所以我想知道是否有工具可以比较和“区分”两个调试信息文件,因为那是我 95% 的空间吗?在迭代之间,调试信息文件中的许多原始内容是相同的(即名称和关系,这在 C++ 中非常冗长)。
使用来自 user657267 的建议,我还研究了使用 -gsplit-dwarf 分离出 .dwo 文件。这可能有效,但我担心的是,随着时间的推移,核心标头会发生变化并导致每个.dwo 文件的微小变化,所以我最终会转移所有内容,假设我的“基础”保持不变,即使大部分内容.dwo 文件的名称保持不变。这可能会以有趣的方式解决(例如.dwo 文件的存储库),但如果可能的话,我想避免它。
那么,假设我有一个来自以前编译的 DWARF 调试信息文件,有没有办法将它与来自当前编译的 DWARF 调试信息文件进行比较,并获得更小的东西来传输?
作为绝对的最后手段,我可以编写某种类型的查找和翻译代码。但是是否有方便的工具用于查看、修改和“取消修改” DWARF 调试信息文件?我找到了像pyelftools 和DWARF utilities 这样的工具。前者只读取 DIE,在我的情况下速度太慢,而后者不适用于 C++,我仍在研究从最新源构建它。
按照这些思路,我调查了dwz 工具announced here 正在做什么,以查看是否可以调整以从现有(但过时的)调试信息文件中借用 DIE。在这个方向上的任何提示、文档或伪代码也会有所帮助。
【问题讨论】:
-
编译时使用
-gsplit-dwarf怎么样? -
@user657267 从这个链接gcc.gnu.org/wiki/DebugFission,我仍然不明白拥有一个单独的 dwarf 文件将如何帮助我更轻松地区分? dwarf文件的格式我还没研究过。
-
也许我误解了这个问题,但是在单独的文件中包含调试符号意味着您可以只
diff两者并分发补丁。 -
diff确实只适用于文本文件——我还不知道 .dwo 文件是否对diff友好。split已经可以将调试符号分离到一个单独的文件中,该文件对diff不友好。 -
gzip压缩文件的效果如何?