代码块不会在所有断点处停止

时间:2017-08-15 17:58:01

标签: c debugging gdb codeblocks

我正在尝试在exim中构建自定义查找,我已经按照文档和良好的基础工作,所以我的其他代码正在编译和连接,以及被调用。我使用Exim附带的Makefile来执行构建,我在CFLAGS=-g -O0中添加了以确保我有调试符号。

Codeblocks,gcc,gdb和源码都存在于我的Linux机箱上,我正在通过XMing进入SSH并将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?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

最初我的GDB源路径设置为:

/home/graeme/exim/src

有问题的代码位于src/lookups,因此添加该路径也可以解决问题

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

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