使用gdb和objdump进行调试

时间:2014-03-12 20:35:36

标签: assembly gdb memory-address objdump

我有很多关于gdb和objdump的问题。

objdump中的地址

如果我这样做: objdump -d binary-file-name ,那么我得到包含这部分的输出:

Disassembly of section .text:

080484a0 <_start>:
 80484a0:   31 ed                   xor    %ebp,%ebp
 80484a2:   5e                      pop    %esi
 80484a3:   89 e1                   mov    %esp,%ecx

我假设第一列中的这些数字是地址?但我不明白如何知道这些地址,因为当一个进程被加载时,它被放置在内存中的一个随机位置,这意味着代码每次都有不同的地址?或者这些地址是否与过程有关? ADDRES空间?

&lt; _start&gt;?

下列出的值是什么?

GDB单步执行代码

我有一个二进制文件,我没有源代码。我想逐步完成该程序,但没有符号信息。我无法在功能名称或亚麻布上设置断点。我试图在地址上设置一个断点,这很有效,但我无法弄清楚如何逐步完成程序。当我做: (gdb)s 要么 (gdb)n 它说它没有行信息,只运行整个功能。 有没有办法逐步完成它,或者逐步完成装配说明?

2 个答案:

答案 0 :(得分:5)

是的,第一列是地址栏。可执行文件在特定地址加载(每个部分都有自己的),除非它们被特别标记为PIE(位置无关可执行文件),在这种情况下显示的地址将从0开始,并且实际上只是从随机加载地址偏移。但是,共享库默认情况下与位置无关,可以映射到不同的地址。

第二列是机器代码本身:程序作为存储在内存中的字节序列以及处理器实际看到和执行的内容。

如果您没有调试信息,则可以分别使用stepinexti(简短格式sini)。如果您没有使用某些GUI前端,layout asm和朋友也可能会有用。

答案 1 :(得分:0)

要添加@Jester的注释,您还可以使用“ x”命令,例如,在达到gdb设置的断点后您可以编写指令来检查指令

(gdb) x/10xb *[address] (to get next 10 bytes of instructions)