使用gdb时找不到调试符号

ant*_*009 34 c++ gdb

GNU gdb Fedora(6.8-37.el5)Kernal 2.6.18-164.el5

我正在尝试调试我的应用程序.但是,每当我将二进制文件传递给gdb时,它会说:

(no debugging symbols found)
Run Code Online (Sandbox Code Playgroud)

这是二进制文件的输出,你可以看到它没有被剥离:

vid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
Run Code Online (Sandbox Code Playgroud)

我正在编译以下CFLAGS:

CFLAGS = -Wall -Wextra -ggdb -O0 -Wunreachable-code
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我,如果我错过了一些简单的吗?

Emp*_*ian 45

存在"找不到调试符号"的最常见原因是链接线上某处-g存在"杂散" -s-S参数.

来自man ld:

   -s
   --strip-all
       Omit all symbol information from the output file.

   -S
   --strip-debug
       Omit debugger symbol information (but not all symbols) from the output file.
Run Code Online (Sandbox Code Playgroud)

  • 存在 -g 时“找不到调试符号”的另一个常见原因是将 CFLAGS 错误拼写为 CFLAGES。至少今天对我来说很常见。 (2认同)

Max*_*kin 29

应用程序必须编译并与-g选项链接.即你需要-g同时加入CPPFLAGS和LDFLAGS.

  • 某些操作系统在链接时需要-g,但Linux不是其中之一.使用'-g'进行编译并在没有它的情况下进行链接仍会生成带有完整调试信息的可执行文件,因此这个答案不太可能是正确的. (3认同)
  • @EmployedRussian 你是对的。但是,我建议无缘无故地避免使用不可移植的快捷方式。记录的行为得到维护,未记录 - 这是您承担的风险。我没有看到这里的风险有任何回报。将 `-g` 添加到链接器标志应该花费您接近 0,但它可能会节省您一天的时间。 (2认同)
  • 永远不会猜到它需要在 LDFLAGS 中! (2认同)

gee*_*aur 16

某些Linux发行版不使用gdb样式调试符号.(他们更喜欢IIRC dwarf2.)

通常,gcc并且gdb将同步它们使用什么样的调试符号,并且强制特定样式将仅引起问题; 除非你知道你需要别的东西,否则就用吧-g.

  • 没有"gdb样式"调试符号.GDB使用平台标准调试格式,在Linux上是矮人{2,3,4}. (3认同)
  • 你好,我犯了一个错误,我用g ++编译.但是,我已更改为-g debug选项.但是,它仍然无法加载符号.谢谢. (2认同)

atx*_*atx 5

将 -ggdb 替换为 -g 并确保您没有使用 strip 命令剥离二进制文件。


Kev*_*ker 5

如果您正在为 Android 编译,您还应该尝试 -ggdb 而不是 -g!