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
仅显示当前堆栈位置的值。上面的命令显示了该位置的值,这是我们压入堆栈的最后一个内容。 (我正在使用汇编程序,需要查看是否正确清除了堆栈,因此最后一件事是调用函数的返回地址)。