【问题标题】:gdb: Cannot Recompile Executable: (no debugging symbols found)gdb:无法重新编译可执行文件:(未找到调试符号)
【发布时间】:2016-07-02 19:37:10
【问题描述】:

我只能访问 C 可执行文件(没有源代码/.c 代码),我需要使用 gdb 来调试它。但我不断收到一条(未找到调试符号)消息。我见过其他类似的问题,但其中大多数建议重新编译源代码(我不能这样做,因为我没有它)或建议进行以下修复(见下文),这对我不起作用。

gdb test
Reading symbols from /usr/bin/test...(no debugging symbols found)...done.
(gdb) b main
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) b 2
No symbol table is loaded.  Use the "file" command.
(gdb) file test
Reading symbols from /usr/bin/test...(no debugging symbols found)...done.
(gdb) exec-file test
(gdb) file test
Reading symbols from /usr/bin/test...(no debugging symbols found)...done.
(gdb) b 2
No symbol table is loaded.  Use the "file" command.

附带说明,我不能在 main 处中断(奇怪,因为我可以保证这是一个 C 可执行文件)。

我是使用 gdb 的新手,非常迷茫,非常感谢任何帮助。非常感谢!

编辑:

正如@Jean-François Fabre 所建议的,我已将可执行文件名称更改为 foobar,但仍然遇到同样的问题。上面的输出已经更新:

gdb foobar
Reading symbols from /usr/bin/foobar...(no debugging symbols found)...done.
(gdb) b main
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) b 2
No symbol table is loaded.  Use the "file" command.
(gdb) file foobar
Reading symbols from /usr/bin/foobar...(no debugging symbols found)...done.
(gdb) exec-file foobar
(gdb) file foobar
Reading symbols from /usr/bin/foobar...(no debugging symbols found)...done.
(gdb) b 2
No symbol table is loaded.  Use the "file" command.

【问题讨论】:

  • 遵循下面 Jean-Francois 的重命名建议。还有其他命令 [gdb 之外] 可以尝试:objdumpreadelf -slddfile 告诉您文件中的符号 [即使调试信息已被剥离,也应该存在这些符号] . b main [in gdb] 的失败可能是 /usr/bin/test 问题
  • 感谢@Craig Estey!这些工具非常有用!

标签: c gdb executable


【解决方案1】:

但我不断收到(未找到调试符号)消息。

此消息表示您的可执行文件没有调试信息。

我不能在 main 处中断(奇怪,因为我可以保证这是一个 C 可执行文件)。

这可能意味着您的可执行文件已被完全剥离(其符号表已被删除;符号表有助于调试,但在运行时完全不需要)。

我需要使用gdb来调试它。

这很好:您仍然可以调试这个可执行文件,但只能在汇编级别。如果没有符号表,您将只能在单个指令地址上设置断点,而不能在任何函数上。

如果您的可执行文件是动态链接的,您应该仍然可以在外部函数上设置断点,例如 printfmalloc(如果您的可执行文件调用它们)。

【讨论】:

  • 感谢您的信息!我完全忘记了动态链接/加载的可执行文件(我很傻)。缺少符号表是否也表明我的可执行文件是动态链接/加载的?
  • 除了我刚刚发表的评论之外,我终于可以用gdb 做我想做的事了,即使用x/s 和信息寄存器等!感谢您和@Craig Estey!
【解决方案2】:

编译代码时不要忘记添加-g。例如:

g++ main.cpp -o main -g
gcc main.c -o main -g

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多