让我先声明这是针对我的第一个 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
标志重新构建二进制文件来解决,但是由于您获得了一个已经编译和链接的文件,所以您不能这样做。
如果没有调试信息,某些命令,例如 list
、break file.c:line
或 break line
将不会 工作。但其他命令,例如:disassemble
和 break function
会起作用,这就是您必须用于此分配的命令。
Is there a command list of codes that are available and not available
我不知道。但是您可以推断从了解调试信息包含的内容中该列表是什么。
调试信息一般包含:
- 从代码地址(即程序计数器)到源文件和行号的映射。 (如果没有这样的映射,
list
和break foo.c:123
就无法工作。) - 局部和全局变量的类型和名称。 (没有这个,
ptype
和whatis
和info locals
无法工作。) - 局部变量和参数在堆栈上的位置。 (再次说明
info locals
、print a_local_var
、print &a_local_var
无法工作。)
关于c - 编译程序上没有使用 GDB 的符号表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002178/