【问题标题】:debugging with gdb and objdump使用 gdb 和 objdump 进行调试
【发布时间】:2014-03-12 20:35:36
【问题描述】:

我有很多关于 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

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

<_start> 下列出的值是什么?

GDB 单步执行代码

我得到了一个没有源代码的二进制文件。我想单步执行程序,但没有符号信息。我无法在函数名或行号上设置断点。我试图在地址上设置断点并且这有效,但我无法弄清楚如何逐步完成程序。当我做: (gdb) 小号 或者 (gdb) n 它说它没有行信息,只是运行整个功能。 有没有办法单步执行它,或者单步执行组装说明?

【问题讨论】:

    标签: assembly gdb memory-address objdump


    【解决方案1】:

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

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

    如果您没有调试信息,您可以使用stepinexti(分别为缩写sini)。如果您不使用某些 GUI 前端,layout asm 和朋友也会很有用。

    【讨论】:

    • 有没有办法知道共享对象映射的随机地址?所以objdump给出的偏移量可以和gdb中的地址匹配。
    • 一旦加载,是的。在 gdb 中你可以使用info proc mappings
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2015-07-01
      • 2021-03-17
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      相关资源
      最近更新 更多