用gdbdebuggingc程序来显示hex地址

我有一个关于debuggingc代码的问题。我做了研究,但是不能满足我。 我知道下面的命令:

(gdb) x/x 'address' #show hexadecimal address (gdb) x/100s 'address' #show next 100 decimals (gdb) x/10b 0x0804846c-10 #show byte at 0x0804846c-10 (gdb) x/10b 0x0804846c+20 #show byte at 0x0804846c+20 (gdb) x/10x 0x0804846c show 10 addresses at 0x0804846c (gdb) x/10x $esp #show next 10 addresses at esp register 

但是我想知道x/10x $esp - 50到底做了什么? 我拿到了吗? 这是对的吗?

“在$ esp之前显示50个地址后,最多可达10个地址”如果你完全告诉我纠正我,我会感激的…… 🙁

从地址(ESP-50)开始检查10个十六进制字。

当您执行$ esp-50时,您正在内存中寻找内存,因为堆栈从最大内存增长到最小内存。

试试这个来更好地理解gdb给你的东西

x / 10xw $ esp-1你正在查看内存较低的地址,你正在从$ esp -1读取1byte($ esp -1不在你的堆栈帧中,堆栈从大到小的地址从当前堆栈帧以$ esp结尾,$ esp -1是一些随机存储器)

x / 10xw $ esp //这会打印出你真正想要看到的内容,打印从当前$ esp及以下

x / 10xw $ esp + 1 //用这个你丢失1个字节,因为还有1个字节被压​​入堆栈,但是你跳过了

  Lower Memory addresses ^$esp -1 random garbadge in memory ^$esp local function variables 0 ^$esp +1 local variable 1 ^ local variable 2 ^ local variable 3 ^ local variable 4 Higer Memory Addresses 

所以当你说x / 10xw $ esp时,gdb会打印$ esp下面的所有内容(但是下面的意思是指更高内存地址中的所有内容都看图)