DWARF调试信息文件的diff工具
DWARF diff tool for debug info file
我有一个没有调试符号的二进制文件,它有10mb大,但是有了调试符号,它有100mb大。在正常的开发周期中,我通过一个非常慢的链接重复复制几个100 MB的二进制文件(带有调试符号)。我正在努力减少我需要发送的信息量,以加快传输速度。
我已经研究了二进制diff工具,如bsdiff和courgette,但是考虑到二进制文件的大小和我希望能够传输它的频率,它们所占用的时间和内存对我来说是令人望而却步的。正如响应中所指出的,有一些方法可以缓解需要将调试信息发送到远程主机的问题。gdbserver
在我的用例中不起作用,因为我们还希望应用程序能够用符号记录回溯信息。考虑使用PC
值和addr2line
,但是如果在远程机器上进行测试的同时试图向前推进,那么保留源二进制文件可能会令人困惑。此外,对于多个开发人员,访问其他开发人员机器上的调试信息并不总是那么容易。
strip
可以从调试信息中分离出二进制文件,所以我想知道是否有工具来比较和"diff"两个调试信息文件,因为这是我95%的空间所在?在迭代之间,调试信息文件中的许多原始内容是相同的(即名称和关系,这在c++中是令人痛苦的冗长)。
使用user657267的建议,我还研究了使用-gsplit-dwarf
来分离.dwo
文件。这可能会起作用,但我担心的是,随着时间的推移,核心头将发生变化,并导致每个.dwo
文件的微小变化,所以我最终会传输一切,假设我的"基础"保持不变,即使.dwo
文件的大部分内容不变。这可能会以有趣的方式解决(例如.dwo
文件的存储库),但如果可能的话,我想避免它。
那么,假设我有一个来自以前编译的DWARF调试信息文件,有没有办法将它与来自当前编译的DWARF调试信息文件进行比较,并获得更小的东西来传输?
作为最后的手段,我可以编写某种类型的查找和翻译代码。但是是否有方便的工具来查看、修改和"取消"DWARF调试信息文件呢?我找到了像pyelftools和DWARF实用程序这样的工具。前者只读取die,对我来说太慢了,而后者不能很好地与c++一起工作,我仍在研究从最新的源代码构建它。
沿着这些思路,我研究了dwz
工具在这里宣布正在做什么,看看是否可以调整以从已经存在(但过时)的调试信息文件中借用die。在这个方向上的任何提示、文档或伪代码也会有所帮助。
在正常的开发周期中,我必须通过非常慢的链接一遍又一遍地复制我的几个100 MB二进制文件(带有调试符号)。
需要吗?
您的用例要求使用远程调试,其中所有调试信息都保留在开发系统中,并且您只需必须将剥离的二进制文件传输到目标。
关于使用gdbserver
的信息在这里。
如果因为某些原因你不能使用gdbserver
…
从这个链接gcc.gnu.org/wiki/DebugFission,我仍然不明白如何有一个单独的矮人文件将帮助我更容易?
使用单独的调试信息,在通常的编译/调试周期中,您将只重新编译几个文件,并重新链接最终的二进制文件。
这意味着大多数.o
和.dwo
文件将不会被重建,这意味着你不必重新发送未更改的.dwo
文件到目标,即你得到增量调试信息更新"免费"。
我们还使用调试符号来为运行中的应用程序中的异常生成回溯。我认为在本地使用符号是该用例的唯一选择。
只有当你坚持用file/line info完全符号化反向跟踪时。
通常的处理方法是让回溯只包含PC
值(可能还有函数名),并在必要时在开发系统上使用addr2line
来恢复文件/行信息。
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在clang++预处理器中确定gcc工具链版本
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 参数化自定义CMake工具链
- 如何在QT中的自定义视频小工具t上绘制矩形
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 用于C++的静态二进制检测或二进制重写工具和框架
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- Q没有管理权限的 exe 无法启动维护工具
- C++合并排序可视化工具
- 为Bazel工具链指定sysroot
- 在自动工具中包含用于不同bin_Programs的不同库
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- Eclipse CDT clang 工具链 - 无法从链接器选项中删除 stdlibc++,但可以添加 libc++,E
- 使用不同的工具时,Eccodes 会产生不同的结果
- Clang 工具,用于提取给定 lambda 类型的 lambda 主体
- 构建LLVM 10 C++工具链的问题
- DWARF调试信息文件的diff工具