【问题标题】:No symbols loaded in gdb?gdb 中没有加载符号?
【发布时间】:2020-08-19 16:38:00
【问题描述】:

这是错误

g++ -o -g home debugTest.cpp
/usr/bin/ld: home: _ZSt4cout: invalid version 4 (max 0)
/usr/bin/ld: home: error adding symbols: bad value
collect2: error: ld returned 1 exit status
make: *** [Makefile:2: home] Error 1

非常令人困惑的是,当我在-o 之后添加-g 时会发生这种情况,反之亦然。我仍然得到“没有加载任何符号”。显然没有这些符号我无法运行run,我显然需要运行run 进行调试。这种“外部”调试只是因为我认为使用 VSC 调试 C++ 并不那么容易。你可以在this看到更多。

谢谢。

编辑

这是我运行gdb home(home 是可执行的)时得到的结果,反之亦然,顺序为-o-g

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from home...
(No debugging symbols found in home)
(gdb) 

运行 fileexec-file home 曾经给我“家中没有符号”但现在它询问我是否要删除 file 的表或导入 exec-file 的新表。当我选择后者时,我收到了相同的消息no debugging symbols

【问题讨论】:

  • 请在交换-o-g 时显示错误消息。
  • 我编辑了发生的事情。
  • 当您使用-o -g 时,是否在您的构建目录中创建了一个名为a.out-g 的文件?在那种情况下,home 真的得到了更新吗?
  • 我不太明白你的意思。起初文件-g 被创建,当-o-g 的顺序不正确时,我似乎从未创建a.out。据我记得,home 保持不变。
  • 不知何故,您的旧 home 文件(如果您想查看它现在是 home.backup)没有得到更新。也许您之前的命令有错字。很难说。

标签: c++ makefile gdb g++


【解决方案1】:

g++-o 选项需要一个参数,即输出文件的所需名称。根据命令行解释的标准 POSIX 约定,并且在我阅读它们时与 g++ 文档一致,它必须紧跟在命令行上的 -o 之后(POSIX 允许将它们合并为一个参数,但我不这样做t 认为 g++ 承认这一点)。

-o 和它的参数之间插入另一个选项是不正确的。我对您的示例的期望是g++ 会将-g 解释为要创建的输出文件的名称,但它可能会执行其他操作,例如使用默认输出文件名a.out。无论哪种方式,在这种情况下,我希望它将 home 解释为 input 文件的名称。它不是 C++ 源文件,它只是作为目标文件或(可能)共享库传递给链接器以包含在链接中。先前存在的home 就是您要调试的文件。据推测,它是在没有调试符号的情况下构建的,并且/或者在构建后被剥离。

您可以将-g 选项放在-o 之后,但它也必须跟在输出文件名之后:

g++ -o home -g debugTest.cpp

-o home 必须被视为一个有凝聚力的单元,不能被拆分。

【讨论】:

    【解决方案2】:

    选项顺序很重要的原因是-o 采用了一个选项参数,它是输出文件的名称。所以当你输入:

    gcc -o -g home debugTest.cpp
    

    你说的是,我想生成一个输出文件名-g,作为输入我想使用文件homedebugTest.cpp。这显然是不对的。

    您需要将选项参数放在它作为参数的选项旁边,所以它必须是:

    gcc -g -o home debugTest.cpp
    

    或者你可以把它完全放在另一边,像这样:

    gcc -o home -g debugTest.cpp
    

    但您不能在选项 (-o) 和它的参数 (home) 之间添加任何内容。

    至于您的调试问题,debugTest.cpp 文件中的内容是什么?如果你运行./home,它会做什么?

    预计到达时间

    很抱歉,我无法重现您的问题,因此您的环境或系统中一定存在您尚未与我们沟通的问题。我拿了你提供的源代码试了一下,效果很好:

    $ g++ -g -o home debugTest.cpp
    
    $ gdb home
    GNU gdb (GDB) 8.2.1
      ...
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from home...done.
    (gdb) run
    Starting program: /tmp/home
    Name
    [Inferior 1 (process 479404) exited normally]
    (gdb) br main
    Breakpoint 1 at 0x5555555552c4: file debugTest.cpp, line 6.
    (gdb) run
    Starting program: /tmp/home
    
    Breakpoint 1, main () at debugTest.cpp:6
    6       int main(){
    (gdb) n
    7         std::string name = "Name";
    (gdb) n
    8         print(name);
    (gdb) n
    Name
    9         return 0;
    (gdb) n
    7         std::string name = "Name";
    (gdb) n
    10      }
    (gdb) n
    0x00007ffff7be30b3 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
    (gdb) n
    Single stepping until exit from function __libc_start_main,
    which has no line number information.
    [Inferior 1 (process 479447) exited normally]
    (gdb) q
    

    【讨论】:

    • 好的,所以-o 参数和可执行文件的名称总是在一起的,明白了。关于调试问题,它只是用一个函数打印简单的“名称”。正如我所提到的,有源代码here 以及内置 vsc 调试器发生的更新。
    猜你喜欢
    • 2016-07-22
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多