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

时间:2012-08-09 19:05:36

标签: 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行)?如果我对我的假设是正确的,那么我们是否找到了其余的数据?它是否必须对堆栈以及特定的堆栈框架执行某些操作,我目前还不知道它?

我很感激您的意见,以便我能在脑海中澄清一切。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:0)

(gdb)x / 32xw $ esp 意思是告诉我esp指向的32个单词字段。

个:32, 格式:十六进制 size:word(gdb上1个word = 32位)

告诉我esp指向的32个单词字段 (hex)0xbffff7e0-(hex)0xbffff7f0 =(dec)3221223392-(dec)3221223408 = 16bytes = 4words