没有在编译程序上使用GDB的符号表

时间:2017-10-29 15:50:49

标签: c list gdb break

让我先说明这是我的第一个C编程课程的项目。我不会提供我的代码,因为它正在运行,但只是需要协助我在执行期间从GDB收到的错误。

据说,我的项目的第一部分是编写一个程序,它将以字节形式获取任何文件,并找到一定长度的字符串。这有效。下一部分是我提供的(3)编译的C文件,我需要使用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源文件,而是之后的压缩文件。

这是我现在的斗争,并希望得到任何解释或帮助我如何解决我遇到的No symbol table is loaded.问题。

1 个答案:

答案 0 :(得分:3)

您收到的No symbol table loaded消息具有误导性:所有 GDB告诉您,您的二进制文件中没有任何调试信息。

通常可以通过使用-g标志重建二进制文件来解决这个问题,但是由于您已经获得了已编译和链接的文件,因此无法执行此操作。

如果没有调试信息,某些命令(例如listbreak file.c:linebreak line 将无效。但是其他命令,例如:disassemblebreak function 工作,并且这是您必须用于此任务的命令。

  

是否有可用且不可用的代码命令列表

不是我知道的。但是,您可以从理解调试信息包含的内容中推断该列表。

调试信息通常包含:

  1. 从代码地址(即程序计数器)到源文件和行号的映射。 (如果没有这样的映射,listbreak foo.c:123就无法工作。)
  2. 本地和全局变量的类型和名称。 (如果不这样做,ptypewhatis以及info locals无效。)
  3. 堆栈上的局部变量和参数的位置。 (再次info localsprint a_local_varprint &a_local_var无法正常工作。)