0x0804889a <+361>: mov %eax,0xc(%esp)
0x0804889e <+365>: movl $0x2b,0x8(%esp)
0x080488a6 <+373>: movl $0x1,0x4(%esp)
0x080488ae <+381>: movl $0x8048ab0,(%esp)
程序正在向 %esp 添加数据(最后一行是我可以探测的内存中的字符串)
我目前正在突破上面的最后一行。和
info registers
显示
esp 0xffffd704 0xffffd704
当我尝试
display
时我得到了
$esp = (void *) 0xffffd704
如果我尝试扔掉它
(gdb) dump memory mem2 0xffffd704 0xffffffff
Cannot access memory at address 0xffffd704
(gdb) info mem
Using user-defined memory regions.
There are no memory regions defined.
如何查看
esp
周围堆栈上的数据?
错误消息具有误导性。根据我的测试,
gdb
会打印该范围内的任何字节是否无法访问。因此,问题出在结束地址上。您可以从/proc/<pid>/maps
获取堆栈顶部,例如我得到的测试程序:
$ grep stack /proc/8277/maps
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack]
gdb
能够毫无问题地转储该内存范围。
当然,如果您只想读取感兴趣的特定值,您可以使用
x
(examine) 命令。
我带着“在当前 esp 显示值与
display
”的陈述来提出这个问题。我无法链接问题和答案,但是如果 OP 接受就可以了。
如果其他人发现这个主题与我有同样的想法,我这样添加:
display /x *(int*)($esp)
/* you can change the type */
使用
display /x $esp
仅显示当前堆栈位置的值。上面的命令显示了该位置的值,这是我们压入堆栈的最后一个内容。 (我正在使用汇编程序,需要查看是否正确清除了堆栈,因此最后一件事是调用函数的返回地址)。
编辑: 下面将打印当前堆栈指针周围的 8 个字。我认为这更接近垃圾场。 (4*4是后面4个字)
display /8wx $esp-4*4
这会转储当前堆栈指针处的值所指向的 4 个字的内存。 (无论是代码还是数据)
display /4wx *(int*)$esp
您可以使用
display
或 x
$esp
的值(它是一个地址):
(gdb) display /x *(int*)($esp)
1: /x *(int*)($esp) = 0xb7eebff4
$esp
的值和变量地址$esp
的值:
(gdb) x *(int*)($esp)
0xb7eebff4: 0x001a4d7c