2

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

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

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

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

4

1 回答 1

0

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

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

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

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

于 2014-07-30T21:55:56.703 回答