如何使用 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 查看堆栈的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GDB 检查堆栈帧?

GDB 问题 - 我如何逐行查看反汇编代码?

Linux 如何查看一个进程的堆栈

如何使用 gdb 探索堆栈/堆?

如何查看xcode调用堆栈

如何获取 gdb 调用堆栈跟踪?