C 调试符号是什么样子的?

C 调试符号是什么样子的?,c,debugging,gdb,C,Debugging,Gdb,通用条款(gcc)4.6.0 GNU gdb(gdb)软呢帽(7.2.90.20110525-38.fc15) 我最近在尝试使用gdb调试问题时遇到了一个问题。当我加载二进制文件时,gdb抱怨“没有找到调试符号” 所以当我做了以下事情: nm ass1 我得到了以下输出(仅示例) 问题是我忘了加-g。所以我决定用-g编译并再次运行nm。我得到了一个simliar输出,它包含我使用的调试符号-g,gdb这次没有抱怨: U __libc_start_main@@G

通用条款(gcc)4.6.0 GNU gdb(gdb)软呢帽(7.2.90.20110525-38.fc15)

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

所以当我做了以下事情:

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

问题是我忘了加-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有任何不同。我想知道我应该找什么?调试符号是什么样子的


非常感谢您的建议,

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

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


(我似乎无法访问其
binutils
将生成
stabs
或GNU
stabs+
格式的机器,因此我将遵从以了解详细信息。)

我已经使用-a完成了这项操作,使用和不使用-g编译这两种情况。然而,我得到了很多符号,但是哪些是调试符号呢?谢谢,让我来解释一下。你可能根本没有任何符号;Linux通常使用DWARF 2调试信息,这些信息存储在不同的ELF段中,而不是符号表(后者是有限的
a.out
格式的保留)。
                 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