【发布时间】: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