memory - gdb 'x' 命令有什么作用?

标签 memory assembly gdb cpu-registers

在我寻求更多地了解计算机的一般过程中,我偶然发现了一本书,其中有一些章节涉及反汇编、x86 汇编语言以及 C 和 x86 汇编之间的关系。现在我一直在读这个GDB命令,但我无法完全理解它。

该命令及其结果如下:

(gdb) x/32xw $esp
0xbffff7e0:    0xb8000ce0 0x08048510 0xbffff848 0xb7eafebc
0xbffff7f0:    0x00000002 0xbffff874 0xbffff880 0xb8001898
0xbffff800:    0x00000000 0x00000001 0x00000001 0x00000000
0xbffff810:    0xb7fd6ff4 0xb8000ce0 0x00000000 0xbffff848
0xbffff820:    0x40f5f7f0 0x48e0fe81 0x00000000 0x00000000
0xbffff830:    0x00000000 0xb7ff9300 0xb7eafded 0xb8000ff4
0xbffff840:    0x00000002 0x08048350 0x00000000 0x08048371
0xbffff850:    0x08048474 0x00000002 0xbffff874 0x08048510

现在,据我所知,我发出的命令告诉调试器:
  • x(第一个):检查内存
  • 32:得到以下 32 个
  • x: 启用十六进制表示
  • w: 给我看 Word尺寸数据。
  • **Note:**我知道我询问了 esp 寄存器,但我不太明白 $ 在它前面做什么。当我尝试不使用它时,我会收到一个丢失符号错误,所以我知道它与引用/取消引用有关吗?

  • 困扰我的是我是如何找到所有这些字节的?由于我正在检查一个寄存器,它的大小是 32 位,我不应该只得到 32 位或 4 个字节(上面只有 1 行)吗?如果我的假设是正确的,那么我们是否找到了其余的数据?它是否必须对堆栈以及我目前不知道的特定堆栈帧执行某些操作?

    我很感激你的意见,这样我就可以澄清我心中的事情。

    最佳答案

    (gdb) help x   
    Examine memory: x/FMT ADDRESS.
    

    将 $esp 作为地址将使 gdb 获取该寄存器中的任何内容并将其用作 x 命令的内存地址 - 并将显示内存中从该地址开始的以下 32 个字。

    gdb 本身中的变量是以 $ 为前缀的名称,gdb 为所有 cpu 寄存器设置预定义的变量。

    如果要检查 esp 寄存器,请使用命令 info registers esp ,正如您将在示例 (x/32xw $esp) 中看到的,esp 寄存器包含显示的第一个地址,0xbffff7e0

    关于memory - gdb 'x' 命令有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11890253/

    相关文章:

    node.js - 从内存中释放大 Node 模块

    assembly - 用 GCC (gas/as) 汇编 elf64 格式的 32 位模式指令

    c - gdb 错误地计算了包含 '#' 的 args

    assembly - ret 指令是否将 4 添加到 esp 寄存器?

    从汇编调用 C 函数、段错误

    c - 使用GDB远程调试多线程C程序

    无法在 malloc() 处设置断点

    javascript - 你能在 JavaScript 中捕获内存不足错误吗

    r - 在 R 中,如何知道函数在执行期间使用的最大内存量?

    c - 我是否了解此 malloc/free 组合的内存问题?