【问题标题】:gdb does not recognise source file until program is rungdb 在程序运行之前无法识别源文件
【发布时间】:2017-09-13 18:14:43
【问题描述】:

当我最初运行 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 通过实际运行代码“发现”)

其次,有什么办法可以解决这个问题吗?

注意如果您想对这个问题投反对票,如果您能告诉我您在 cmets 中这样做的原因,我将不胜感激。否则,我将保持无知。另外,请随时要求澄清

谢谢

【问题讨论】:

    标签: c++ debugging gdb


    【解决方案1】:

    为了安装断点,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)
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多