如何使用 GDB 查看堆栈的内容?

我是广发行的新员工,所以我有几个问题:

  • 如何查看堆栈的内容? 示例: 要查看 register 的内容,我键入 info registers。对于堆栈,它应该是什么?

  • 我怎样才能看到 $0x4(%esp)的内容? 当我键入 print /d $0x4(%esp)时,GDB 给出了一个错误。

平台: Linux 和 GDB

269626 次浏览

您需要使用 gdb 的内存显示命令。最基本的是 x检查。在链接到的页面上有一个示例使用

gdb> x/4xw $sp

以十六进制(x)打印“堆栈指针(这里,$sp)上方的四个单词(w)”。这段引文稍作了解释。

info frame显示堆栈帧信息

要读取给定地址的内存,应该查看 x

x/x $esp为十六进制 x/d $esp为有符号 x/u $esp为无符号等 x 使用的格式语法,你也可以看看当前的指令通过 x/i $eip等。

用途:

  • 返回跟踪: 显示堆栈函数和参数
  • info frame-显示堆栈开始/结束/args/本地指针
  • 显示堆栈内存
(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