c - 调试符号是什么样的?

标签 c debugging gdb

海合会 (海湾合作委员会) 4.6.0 GNU gdb (GDB) Fedora (7.2.90.20110525-38.fc15)

我最近在尝试使用 gdb 调试我的问题时遇到了一个问题。当我加载我的二进制文件时,gdb 提示“没有找到调试符号”

所以当我执行以下操作时:

nm ass1

我得到了以下输出(仅示例)

00000000006026e0 t __init_array_end
00000000006026d0 t __init_array_start
00000000004020e0 T __libc_csu_fini
0000000000402050 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000006029ec A _edata
0000000000602b28 A _end
000000000040212c T _fini
0000000000401420 T _init
0000000000401610 T _start
                 U atoi@@GLIBC_2.2.5
000000000040163c t call_gmon_start
0000000000602b10 b completed.5886
00000000006029e8 W data_start
0000000000602b18 b dtor_idx.5888
00000000004016d0 t frame_dummy
00000000004016f4 T main

问题是我忘了添加-g。所以我决定用 -g 编译并再次运行 nm。我得到了一个类似的输出,其中包含我使用 -g 时的调试符号,而 gdb 这次没有提示:

                 U __libc_start_main@@GLIBC_2.2.5
00000000006029ec A _edata
0000000000602b28 A _end
000000000040212c T _fini
0000000000401420 T _init
0000000000401610 T _start
                 U atoi@@GLIBC_2.2.5
000000000040163c t call_gmon_start
0000000000602b10 b completed.5886
00000000006029e8 W data_start
0000000000602b18 b dtor_idx.5888
00000000004016d0 t frame_dummy
00000000004016f4 T main
                 w pthread_cancel

除了二进制文件更大之外。我可以注意到使用 nm 有任何不同。我想知道我应该寻找什么?调试符号是什么样的?

非常感谢您的任何建议,

最佳答案

nm 默认隐藏调试符号。使用 -a 选项来显示它们。

现代系统通常不使用调试符号本身stabs 调试格式是为与 a.out 格式的可执行文件一起开发的,它只能表示有限数量的内部结构;这导致在符号表中隐藏了很多东西,例如调试符号和 initializers/constructors . COFF(现在大部分已过时)和 ELF 文件格式允许使用任意部分,大多数现代 Linux 发行版配置 gcc 以使用 DWARF 2调试信息。您应该能够使用 GNU objdump检查该信息。

(我似乎无法访问其 binutils 将生成 stabs 或 GNU stabs+ 格式的机器,所以我'详情请引用 Google。)

关于c - 调试符号是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397793/

相关文章:

c - 二维数组 - 我想找到每行中哪些列中有 1

debugging - 调试器断点如何有效实现?

java - 测试数组类类型对象时出现 Eclipse ClassNotLoadedException

java - 如何在 Java 的 jdb 调试器中打印一个数组?

c - 乘法在 for 循环中不能很好地工作

c - 使用 MinGW 如何创建没有只读文件属性的文件?

c - 使用端口号和 IP 地址的命令行参数进行套接字编程

c++ - Eclipse CDT - gdb watch 表达式

rust - 如何在异步函数中设置断点?

c - 有用于 zOS 的 C 调试器吗?