如何用gdb读取esp

问题描述 投票:0回答:2
   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 的全部价值?

debugging memory assembly gdb
2个回答
1
投票

错误消息具有误导性。根据我的测试,

gdb
会打印该范围内的任何字节是否无法访问。因此,问题出在结束地址上。您可以从
/proc/<pid>/maps
获取堆栈顶部,例如我得到的测试程序:

$ grep stack /proc/8277/maps
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack]

gdb
能够毫无问题地转储该内存范围。

当然,如果您只想读取感兴趣的特定值,则可以使用

x
(examine) 命令。


0
投票

我带着“在当前 esp 显示值与

display
”的陈述来提出这个问题。我可以链接问题和答案,但是如果OP接受的话就可以了。

如果其他人发现这个主题与我有同样的想法,我这样添加:

display /x *(int*)($esp)
/* you can change the type */

使用

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

© www.soinside.com 2019 - 2024. All rights reserved.