调试符号是什么样的?

时间:2011-06-18 17:49:57

标签: c debugging gdb

gcc(GCC)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。我有一个simliar输出,这包含我使用-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的任何不同。我想知道我应该找什么?调试符号是什么样的?

非常感谢任何建议,

1 个答案:

答案 0 :(得分:7)

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

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

(我似乎无法访问binutils将生成stabs或GNU stabs+格式的计算机,因此我将遵从Google细节。)