编译库以便 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}