Debugging 如何用gdb阅读esp

Debugging 如何用gdb阅读esp,debugging,memory,assembly,gdb,Debugging,Memory,Assembly,Gdb,当我试图显示时,我得到了 esp 0xffffd704 0xffffd704 如果我想甩掉它 $esp = (void *) 0xffffd704 如何查看esp的完整值?错误消息具有误导性。根据我的测试,gdb打印该范围内的任何字节是否不可访问。因此,问题在于结束地址。您可以从/proc//maps获取堆栈顶部,例如,对于我得到的测试程序: (gdb) dump memory mem2 0xffffd704 0xffffffff Cannot access

当我试图
显示
时,我得到了

esp            0xffffd704       0xffffd704
如果我想甩掉它

$esp = (void *) 0xffffd704

如何查看esp的完整值?

错误消息具有误导性。根据我的测试,
gdb
打印该范围内的任何字节是否不可访问。因此,问题在于结束地址。您可以从
/proc//maps
获取堆栈顶部,例如,对于我得到的测试程序:

(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.
gdb
能够毫无问题地转储该内存范围


当然,如果您只想读取感兴趣的特定值,可以使用
x
(检查)命令。

进程的内核空间中有
0xffffd704
,而
gdb
不能转储内核空间。您应该使用
kgtp
来帮助您。从
ebp
的值来看,我认为堆栈空间已被溢出损坏。@NanXiao如果在64位linux下运行32位程序,您将获得该范围内的堆栈,这通常是可访问的用户空间。然而,
gdb
确实无法转储该内存,如问题所示。这确实在64位linux中运行。但该程序作者声称它也编译为64位。即使只有当arch==i386时,我才能在gdb上运行它。
(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.
$ grep stack /proc/8277/maps
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack]