2017-08-15 48 views
0

我正在尝试在exim中构建自定义查找,我遵循了文档和良好的基础工作,因此我的附加代码正在编译和挂接以及被调用。我使用Exim附带的Makefile来执行构建,并且我在CFLAGS=-g -O0中添加了以确保我有调试符号。在所有断点处都没有停止的代码块

Codeblocks,gcc,gdb和源代码都在我的Linux机器上,我使用XMing将X会话导入并导出到Windows桌面,但我不认为这有任何问题,但值得一提。现在,我的问题是,当我运行带有断点的调试器时,C :: B似乎没有设置,或者gdb忽略了我的代码中的断点,但正在击中我在main函数中的断点(我添加了一个在退出时,我可以读取执行输出并证明它们正在工作)。

我已经确认我的代码实际上是被调用的,它目前吐出一个错误信息,它正在做什么。如果我在该行上添加断点,它不会触发,也不会触发函数或函数的第一行。

什么是更奇怪的(对我来说),是以前它工作!它只是在我调整底部C :: B窗格的大小时才停止工作,这导致屏幕的一部分无法呈现(我认为这是C :: B和XMing的问题,有时我只是得到一个灰色的空白窗口,需要停止并重新启动C :: B)。所以我退出C :: B,重新启动它,重新加载我的项目,然后在我的代码中断点根本不工作,即使我可以证明代码正在执行。

此外,如果我手动添加断点,它按预期工作。我在main的开始处在C :: B中设置了一个断点。点击调试,然后发送b mddfind_open(我的函数的名称)到gdb中,然后按继续。C :: B在该函数的开始处再次停止。 C :: B如何将断点传递给gdb可能有些不可思议吗?

更新: 我正在研究的项目是Exim,它将代码链接到构建目录(由于gcc 2.92.x和extern的IIRC的一些错误)。如果我从C :: B中的该位置打开该文件并设置一个断点,它按预期工作。我怀疑C :: B可能将不正确的引用传递给gdb?

任何想法?

+0

所以它是codeblocks问题 –

+0

我认为这可能是在这种情况下二进制的方式是没有路径信息存储的符号。因此,gdb正在寻找源代码的错误位置。将子路径添加到源代码目录中修复了它。谢谢 – Graeme

+0

它没有什么共同的编程。这是一个配置问题。我正在投票关闭 –

回答

0

似乎在这种情况下,我需要指定源文件的源路径,即使它位于根源路径中。

本来我有我的GDB源路径设置为:

/home/graeme/exim/src 

有问题的代码存在于src/lookups,所以加入这条道路也解决了这个问题

/home/graeme/exim/src 
/home/graeme/exim/src/lookups 

我认为这种情况已经出现因为我构建的代码最初被编译成一个静态库,然后这个库被链接到主程序本身中。由于这些符号引用位于库编译点处的库源文件的来源。所以在这种情况下,有多个软件包正在构建,我需要在源路径中引用它们中的每一个。

相关问题