编译程序使用GDB时没有符号表

4

首先声明,这是我第一次C编程课的项目。我不会提供我的代码,因为它已经在运行,但我需要帮助解决GDB执行过程中出现的错误。

说完这个,我的项目的第一部分是编写一个程序,可以接受任何文件的字节形式,并查找特定长度的字符串。这一部分已经完成。接下来,我需要使用GDB、十六进制编辑器和我的程序来破解隐藏密码以解锁程序,而我已经破解了第一个,但第二个和第三个越来越难,我无法弄清楚自己到底做错了什么。

这是我的问题:

当我使用GDB开始运行编译后的文件时,我立即在GDB中看到一个闪烁的光标。我按下cntrl c以中断程序,这使程序停在原地。然后我输入back,得到一个包含(9)行、它们的内存位置和方法名称的列表。这就是我的问题所在,如果我想要进入main(),并尝试输入一个断点,它告诉我No symbol table is loaded. Use the "file" command

Starting program: [program path on university server] 
^C
Program received signal SIGINT, Interrupt.
0x00110430 in __kernel_vsyscall ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-
1.132.el6_5.3.i686
(gdb) list
No symbol table is loaded.  Use the "file" command.
(gdb) back
#0  0x00110430 in __kernel_vsyscall ()
#1  0x00c8f8d3 in __read_nocancel () from /lib/libc.so.6
#2  0x00c2972b in _IO_new_file_underflow () from /lib/libc.so.6
#3  0x00c2b44b in _IO_default_uflow_internal () from /lib/libc.so.6
#4  0x00c2ca5a in __uflow () from /lib/libc.so.6
#5  0x00c1f36c in _IO_getline_info_internal () from /lib/libc.so.6
#6  0x00c1f2b1 in _IO_getline_internal () from /lib/libc.so.6
#7  0x00c1e1ea in fgets () from /lib/libc.so.6
#8  0x0804851c in main ()
(gdb) 

我看了其他像gdb: "No symbol table is loaded"这样的帖子,但我不认为这与我有关,因为我尝试“破解”的文件已经编译并提供给我。所以我不是在调试C源文件,而是压缩后的文件。
这是我现在的困境,我需要任何解释或帮助来解决我正在遇到的“未加载符号表”问题。

1
你在编译程序时使用了-g标志吗? - user2979872
但是你并不是在尝试进入断点。你正在尝试在帧#0中“列出”源代码。 - ks1322
@user2979872 我无法编译它。这是我的教授提供的已编译的C文件,我必须尝试使用GDB输入。 - Pwrcdr87
@ks1322 我也尝试了 break 8,但仍然得到相同的响应。抱歉我没有在那里放置 break 行。但是我尝试过的 list 和其他命令都得到了相同的响应。 - Pwrcdr87
1个回答

10
您收到的“未加载符号表”消息是误导性的:GDB只是告诉您,您的二进制文件中没有任何调试信息。通常使用带有“-g”标志重新构建二进制文件可以解决此问题,但由于您已经获得了编译和链接后的文件,因此无法这样做。没有调试信息,某些命令(如“list”,“break file.c:line”或“break line”)将不起作用。但是其他命令(例如:“disassemble”和“break function”)将起作用,这就是您必须在此任务中使用的命令。我不知道是否有可用和不可用代码的命令列表。但您可以通过了解调试信息包含的内容来推断出该列表。调试信息通常包含:
1. 从代码地址(即程序计数器)到源文件和行号的映射。(如果没有这种映射,“list”和“break foo.c:123”无法工作。) 2. 本地和全局变量的类型和名称。(如果没有这些信息,“ptype”、“whatis”和“info locals”无法工作。) 3. 本地变量和参数在堆栈上的位置。(同样,“info locals”、“print a_local_var”、“print &a_local_var”无法工作。)

我爱你!这就是答案。这些情况下是否有可用和不可用的代码命令列表?我对GDB很陌生(只做过一个实验)。 - Pwrcdr87
这就是答案。非常感谢@Employed Russian。你让我保住了一些头发。 - Pwrcdr87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接