如何从gdb解释堆栈内存

时间:2018-04-12 06:38:57

标签: assembly memory x86 stack

组装相当新,在使用gdb时无法理解如何解释堆栈内存。我明白bt和info框架显示的是什么。 x / 10x显示从当前堆栈指针开始的前10个值,但您如何解释它?第一列是堆栈级别,我假设这意味着堆栈帧?并且在第一列之后有32位,这些十六进制值中的每一个是什么意思?

(gdb) bt
#0  zzz () at zzz.c:96
#1  0xf7d39cba in yyy (arg=arg@entry=0x0) at yyy.c:542
#2  0xf7d3a4f6 in yyyinit () at yyy.c:590
#3  0x0804ac0c in gnninit () at gnn.c:374
#4  main (argc=1, argv=0xffffd5e4) at gnn.c:389

(gdb) info frame
Stack level 0, frame at 0xffeac770:
eip = 0x8049047 in main (goo.c:291); saved eip 0xf7f1fea1
source language c.
Arglist at 0xffeac768, args: argc=1, argv=0xffffd5e4
Locals at 0xffeac768, Previous frame's sp is 0xffeac770
Saved registers:
ebx at 0xffeac75c, ebp at 0xffeac768, esi at 0xffeac760, edi at 0xffeac764, 
eip at 0xffeac76c

(gdb) x/10x $sp
0xffeac63c: 0xf7d39cba  0xf7d3c0d8  0xf7d3c21b  0x00000001
0xffeac64c: 0xf78d133f  0xffeac6f4  0xf7a14450  0xffeac678
0xffeac65c: 0x00000000  0xf7d3790e

1 个答案:

答案 0 :(得分:1)

(gdb) x/10x $sp
0xffeac63c: 0xf7d39cba  0xf7d3c0d8  0xf7d3c21b  0x00000001
0xffeac64c: 0xf78d133f  0xffeac6f4  0xf7a14450  0xffeac678
0xffeac65c: 0x00000000  0xf7d3790e

第一列是后面第一个字节的内存地址。

其他四列是存储在内存中的四个32位值。

即。第一行表示在地址0xffeac63c处,内存包含字节值0xba,在地址0xffeac63d处有值0x9c等等。直到地址0xffeac64b,其中存储值0x00(Intel是小端,所以dword 0xf7d39cba是以字节ba 9c d3 f7)存储在内存中。

这些值意味着什么......好吧,0xf7d39cba0xf7d39cba,是32位值。内存的内容并不意味着什么,直到你通过使用它们的代码赋予这些值一些意义。

即。如果下一条要执行的指令是retesp指向0xf7d39cba,那么该值将用作返回地址。

如果下一条指令是pop eax,那么该值将被提取到寄存器eax中,并用于代码在eax ... {/ p>}中的值所做的任何事情。