【问题标题】:Minimizing the size of debugging information for testing at a remote location最大限度地减少调试信息的大小,以便在远程位置进行测试
【发布时间】:2014-07-29 18:29:09
【问题描述】:

我正在尝试创建一种将 C++ 项目的调试信息传输到远程位置进行测试的方法。在当前的开发周期中,对代码的微小更改需要传输整个二进制文件(大小为 100s MB,主要是调试信息)。

目前我解决这个问题的方法是使用 -gsplit-dwarf 将调试信息从目标文件中分离出来(没有调试信息的大小在我的连接上是可管理的),然后将调试文件与当前在远程盒子上构建。

目的是为项目的调试文件提供一组补丁,以便可以在远程位置调试新代码。远程位置和本地计算机之间的连接速度很慢,因此最小化补丁的大小是最重要的,但它也应该与工具的运行时间相平衡。我已经将 bsdiff 和 xdelta 视为潜在的解决方案,并遇到了一个难题,其中 xdetla 速度快但太大而 bsdiff 在大小方面是完美的,但运行时间和内存要求比我想要的要高一点。

是否有我遗漏的工具或方法,或者我只是以错误的方式解决这个问题?也许是 bsdiff 和 xdelta 的替代品?我知道像 gbdserver 这样的工具在这种情况下无法工作,因为我们在实际调试时有一些要求。 bsdiff 的一些改变可以帮助提高性能吗?事实上,如果我使用的方法是合理的,那么在远程机器上保留构建副本以进行比较的好方法是什么。

【问题讨论】:

  • 有一些方法可以在与可执行文件不同的文件中获取调试信息,但我不知道该怎么做。
  • 是的,我在使用 C++ 编译时使用 -gsplit-dwarf 标志,它将调试信息分离到 .dwo 文件中。我遇到的问题是 .dwo 文件太大而无法及时传输。我正在尝试使用 bsdiff 来生成这些文件的补丁。抱歉,如果不清楚。
  • 用 gdbserver 我猜你可以在本地保存调试信息,只远程传输可执行文件。
  • 我们使用调试符号为正在运行的应用程序中的异常生成回溯。所以我相信他们需要在测试机器上。

标签: c++ linux gdb dwarf binary-diff


【解决方案1】:

最简单的方法是使用“strip”将调试信息复制到单独的“.debug”文件中,然后再次使用“strip”从您将部署的可执行文件中删除调试信息。 “strip”手册解释了如何做到这一点,寻找“--only-keep-debug”选项。

完成此操作后,您可以通过各种方式告诉 gdb 单独的调试信息。最好的方法是使用“build-id”功能。这就是现代 Linux 发行版所做的。但是,还有其他方法。 gdb 手册中有一个完整的部分介绍了单独的调试文件。

这里的关键是您可以在剥离的可执行文件上启动 gdb,它会自动找到单独的调试信息。这些数据都可以是本地的,因此您不需要部署调试信息。

如果您在完成此操作后仍然关心缩减调试信息,您可以查看“dwz”工具。这是一个 DWARF 压缩器。然而,这通常只在您计划将调试信息发送到某个地方时才有意义——发行版使用它来更容易下载调试信息,但普通用户不会真正看到需要。

【讨论】:

  • 这个 build-id 功能听起来很有帮助,它是如何工作的?
  • gdb(也许还有 gcc?)手册中有文档。基本上,它将哈希代码放入生成的可执行文件或库中,然后使用此哈希查找相应的调试信息——strip 在将代码与调试信息分离时保留哈希。
  • build id 和相关功能真的很有帮助,它让我可以使可执行文件和 dwarf 文件都可移植。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2021-02-11
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多