如何使用 GDB 查看堆栈的内容?
Posted
技术标签:
【中文标题】如何使用 GDB 查看堆栈的内容?【英文标题】:How can one see content of stack with GDB? 【发布时间】:2011-12-12 12:32:20 【问题描述】:我是 GDB 的新手,所以我有一些问题:
如何查看堆栈的内容?
示例:要查看寄存器的内容,我输入info registers
。对于堆栈,应该是什么?
如何查看$0x4(%esp)
的内容?当我输入print /d $0x4(%esp)
时,GDB 报错。
平台:Linux 和 GDB
【问题讨论】:
Using GDB to inspect the Machine Stack 的可能重复项 【参考方案1】:您需要使用 gdb 的 memory-display 命令。最基本的是x
, for examine。链接到的页面上有一个示例使用
gdb> x/4xw $sp
以十六进制 (x
) 打印“堆栈指针(此处为 $sp
)上方的四个内存字 (w
)”。引文略有改写。
【讨论】:
【参考方案2】:info frame
显示堆栈帧信息
要读取给定地址的内存,您应该查看x
x/x $esp
for hex x/d $esp
for signed x/u $esp
for unsigned etc. x 使用格式语法,您也可以通过x/i $eip
等查看当前指令。
【讨论】:
【参考方案3】:用途:
bt
- 回溯:显示堆栈函数和参数
info frame
- 显示堆栈开始/结束/args/locals 指针
x/100x $sp
- 显示堆栈内存
(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
【讨论】:
以上是关于如何使用 GDB 查看堆栈的内容?的主要内容,如果未能解决你的问题,请参考以下文章