当我尝试调试一个可执行文件时:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
那到底是什么意思呢?
符号表是否附加到可执行文件中?
当我尝试调试一个可执行文件时:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
那到底是什么意思呢?
符号表是否附加到可执行文件中?
gdb使用两组符号。
-g是调试符号,有了它会使得调试代码和查看变量变得更加容易。
另一组符号在编译时默认被包含。这些是链接符号,存储在ELF(可执行链接格式)符号表中。相比于调试符号,这些符号仅包含最重要的信息,如可执行文件(或库或对象文件)中各个元素的地址。如果没有这些信息,gdb甚至都不知道main函数在哪里,所以(gdb) break main的断点设置会失败。
如果你没有调试符号(-g),那么你仍然可以(gdb) break main,但是gdb将无法理解源文件中的代码行。当你尝试逐行调试代码时,每次只能前进1条机器指令而不是一行代码。
strip命令通常用于从可执行文件(或其他对象文件)中削减符号。如果你不想让别人看到符号或想要节省文件空间,那么就经常使用这个命令。符号表可能很大。strip将删除调试符号和链接符号,但它有几个命令行开关可以限制它删除的内容。
如果你在程序上运行file命令,则其中一个输出将告诉你可执行文件是否已剥离符号。
$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$
这是因为你没有开启调试编译。尝试使用 gcc -g file.c 进行编译。
objdump -f main
main: file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048054
使用GNU调试器在那里设置一个断点
gdb
exec-file main
break *0x8048054
set disassemble-next-line on
run
gdb
stepi
特别说明
如果您正在使用最新版本的Ubuntu,则不受此影响,但如果您正在运行Ubuntu 10.04或更早版本,则可能遇到此错误。
https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/151518G
.dynsym
,对吧?)会被strip
命令删除吗?根据这篇文章,它们不会被删除。 - Alexander Malakhov-g
标志意味着“请提供调试符号”对于许多编译器来说是必须的,但是他们可以在没有该标志的情况下添加符号或者不生成它们。这些符号包含信息,例如“代码地址=>(函数:行号)”,以及“在这个代码地址上,X的最新值在这个寄存器中”。 - nategoose