gdb的'x'命令是做什么的?

4

在我探索计算机知识的过程中,我偶然发现了一本书,其中有一些章节介绍了反汇编、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大小数据。
  • **注意:**我知道我在问esp寄存器,但是我不太理解$在它前面做了什么。当我尝试不使用它时,会出现缺少符号错误,因此我认为它与引用/解引用有关?

困扰我的是,我如何找到所有这些字节?既然我正在检查一个大小为32位的寄存器,那么我不应该只获得32位或4个字节(上面的1行)吗?如果我的假设正确,那么我们在哪里找到剩余的数据?这是否与堆栈和我当前不知道的特定堆栈框架有关?

我很感激您的意见,以便我可以澄清我的思路。

3个回答

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

给定 $esp 作为地址,GDB 将获取寄存器内的任何内容,并将其用作 x 命令的内存地址 - 并显示从该地址开始的内存中的以下 32 个单词。
在 GDB 中,以 $ 为前缀的变量是指 gdb 自身的变量,GDB 为所有 CPU 寄存器设置了预定义变量。
如果您想检查 esp 寄存器,请使用命令 info registers esp,正如您在示例(x/32xw $esp)中看到的那样,esp 寄存器包含第一个显示的地址 0xbffff7e0。

2

它为您提供32个字的内存,其中esp寄存器指向(显然该寄存器包含地址0xbffff7e0)。


1

(gdb) x/32xw $esp

这意味着显示esp指向的32个字的字段。

pieces:32, format:hex , size:word (1 word= 32 bit on gdb)

显示esp指向的32个字的字段 (hex)0xbffff7e0 - (hex)0xbffff7f0 = (dec)3221223392 - (dec)3221223408 = 16bytes=4words


请注意,GDB的“字”大小不一定与ISA对“字”的定义相匹配。例如,在x86(包括x86-64)上,文档使用word = 16位,如movzx eax,word ptr [rdi]cwd - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接