编译库以便 GDB 自动查找源

Posted

技术标签:

【中文标题】编译库以便 GDB 自动查找源【英文标题】:Compile library such that GDB finds sources automatically 【发布时间】:2019-07-19 17:59:05 【问题描述】:

我们正在 Linux 下使用 CMAKE 编译一个库,然后默认安装在 /opt/mylib 下,其源代码也放置在此文件夹中。

当用户尝试使用 GDB 进行调试时,GDB 不会自动找到库源。

我们如何编译 GDB 查找源的库而不指定任何内容?

例如,C++ 标准库就是这样工作的。我可以调试应用程序,而不必告诉 GDB 在哪里可以找到源代码。

注意:这个问题不是关于如何让GDB找到源(我知道怎么做)而是如何适配CMakeLists.txt和编译过程中不需要手动指定GDB中的源目录.

【问题讨论】:

我认为这是不可能的,但一种解决方案可能是在目标机器上定义一个符号链接,名为 /path/to/my/sources,指向 /opt/mylib 我相信它可能的,因为rpmbuild 执行类似的技巧来创建 debuginfo RPM,它不仅安装调试符号而且安装源,后者在与构建二进制文件的位置不同的位置。 GDB 正确定位了以这种方式提供的源。我只是不知道rpmbuild 是怎么做到的。 经过调查,似乎rpmbuild 附带了一个程序debugedit,用于修改ELF 调试信息。这是一个内部程序,未安装在路径中,并且与许多其他 RPM 组件不同,它是二进制文件,而不是脚本。如果你想弄清楚它是如何工作的,那么我确定源是可用的。 @JohnBollinger:debugedit 看起来是一个潜在的解决方案。非常感谢! 【参考方案1】:

您可能正在寻找-fdebug-prefix-map=old=new GCC 标志。

来自manual:

编译驻留在旧目录中的文件时,记录描述它们的调试信息,就好像文件驻留在新目录中一样。这可用于在调试信息中用安装时路径替换构建时路径。它还可用于通过使用将绝对路径更改为相对路径。对于新的。这可以提供更多可重现的构建,这些构建与位置无关,但可能需要一个额外的命令来告诉 GDB 在哪里可以找到源文件。另请参阅 -ffile-prefix-map。

如果您想在不安装它们的情况下调试已构建的二进制文件,则“可能需要额外的命令”部分适用。调试已安装的二进制文件将正常工作 (TM)。

【讨论】:

以上是关于编译库以便 GDB 自动查找源的主要内容,如果未能解决你的问题,请参考以下文章

Linux编译器gcc/g++调试器gdb项目自动化构建工具make/Makefilegit

Linux系统开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}

自动从 ActionScript 源生成 SWF,以便从 JavaScript 调用

Linux下环境基础开发

gcc,gdb,make学习

Linux环境基础开发工具的使用