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

Pwr*_*r87 2 c gdb list 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) 
Run Code Online (Sandbox Code Playgroud)

我看过其他线程,如gdb:“没有加载符号表”,我认为这与我无关,因为我试图“破解”的文件已经编译并提供给我。所以我不是在调试 C 源文件,而是在调试之后的压缩文件。

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

Emp*_*ian 7

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

通常这是通过使用-g标志重建二进制文件来解决的,但是由于您获得了一个已经编译和链接的文件,因此您不能这样做。

如果没有调试信息,某些命令,如listbreak file.c:linebreak line无法正常工作。但是其他命令,例如:disassemblebreak function 起作用,这就是您必须用于此分配的命令。

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

不是我所知道的。但是您可以从了解调试信息包含的内容中推断出该列表是什么。

调试信息一般包含:

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