在程序运行之前,gdb无法识别源文件

时间:2017-04-18 03:37:08

标签: c++ debugging gdb

当我最初运行gdb时,似乎gdb无法识别任何给它的源文件(为了添加断点),除非程序首次运行干净,没有任何断点:

不起作用:

(gdb) break dir1/dir2/filename.cxx:1 No source file named break dir1/dir2/filename.cxx.

确实有效:

(gdb) run etc, etc ... [Thread 0x... (LWP 14348) exited] [Thread 0x... (LWP 14347) exited] [Thread 0x... (LWP 14335) exited] [Inferior 1 (process 14335) exited normally] (gdb) break dir1/dir2/filename.cxx:1 Breakpoint 1 at 0x...: dir1/dir2/filename.cxx, line 1.

我快速搜索了gdb错误列表:https://sourceware.org/bugzilla/
它似乎并不存在。 Stack Overflow似乎同样是空的。

首先,是否有任何迹象表明为什么会发生这种情况,(我怀疑程序本身可能是问题。或者源文件可能只是由gdb通过实际运行代码“发现”)

其次,有没有办法解决这个问题?

注意如果您想对这个问题进行投票,我将不胜感激,如果您能在评论中告知我您为何这样做。否则,我会一直无知。另外,请随时要求澄清

谢谢

1 个答案:

答案 0 :(得分:0)

为了安装断点,gdb需要知道对应于所请求的源代码位置的可执行文件的偏移量。从符号表中检索此偏移量。当实际加载特定可执行文件(或dll)或请求gdb明确地确认它时(例如,使用file命令),符号表变为可用。但是有可能preinstall断点 - 告知gdb你想要一个断点,但是当所需的符号表可用时,它将在未来实际安装。在这种情况下,你应该看到这样的东西:

(gdb) break dir1/dir2/filename.cxx:1
No source file named break dir1/dir2/filename.cxx.
Make breakpoint pending on future shared library load? (y or [n])

如果您没有收到此消息,则可能已关闭待处理的断点。您可以通过执行

来检查
gdb show breakpoint pending

如果已关闭,则可以使用

启用它
gdb set breakpoint pending on (or auto)