如何用gdb读取堆栈内存

问题描述 投票:0回答:3
   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
3个回答
1
投票

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

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

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

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

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

x
(examine) 命令。


1
投票

我带着“在当前 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

0
投票

您可以使用

display
x

显示

$esp
的值(它是一个地址):

(gdb) display /x *(int*)($esp)
1: /x *(int*)($esp) = 0xb7eebff4

x

$esp
的值和变量地址
$esp
的值:

(gdb) x *(int*)($esp)
0xb7eebff4:     0x001a4d7c
© www.soinside.com 2019 - 2024. All rights reserved.