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

标签 c list gdb break

让我先声明这是针对我的第一个 C 编程类(class)的项目。我不会提供我的代码,因为它正在运行,但我只需要帮助解决我在执行期间从 GDB 收到的错误。

话虽如此,我项目的第一部分是编写一个程序,该程序将采用字节形式的任何文件,并定位一定长度的字符串。这行得通。下一部分是为我提供 (3) 编译的 C 文件,我需要使用 GDB 以及十六进制编辑器和我的程序来找出隐藏密码来解锁程序。我拿到了第一个,但是第二个和第三个难度越来越大,我不知道我做错了什么。

这是我的问题:

当我使用 GDB 开始运行编译文件时,我立即在 GDB 中看到一个闪烁的光标。我按 cntrl c 中断程序,该程序将程序暂停在其轨道上。然后我输入 back 并获得 (9) 行的列表、它们的内存位置以及它们的方法名称。这就是我的问题所在,如果我想转到 main(),并尝试输入一个中断,它会告诉我 没有加载符号表。使用"file"命令

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. 我遇到的问题,希望能提供任何解释或帮助。

最佳答案

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

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

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

Is there a command list of codes that are available and not available

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

调试信息一般包含:

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

关于c - 编译程序上没有使用 GDB 的符号表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002178/

相关文章:

c - 在 ELF 或 DWARF 中,如何获取 .PLT 部分的值? -- 尝试获取有关检测工具所在位置的函数地址

c++ - GDB - 如何打破 "something is written to cout"?

python - 如何获取字典列表中具有最高值的字典

c - GDB劣质退出

c - 无法使用 fopen() 打开文件

c++ - 构建 Armadillo 线性代数库,无法与 Ubuntu 14.04.3 LTS 上的 SuperLU 链接。制作共享对象时不能使用X

java - Java中的列表列表

javascript - 根据数字排序顺序更新自动重新排列 HTML 列表

Python 运行时与 C 运行时

c - %i 或 %d 使用 printf() 在 C 中打印整数?