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


94

我是GDB的新手,所以我有一些问题:

  • 如何查看堆栈的内容?示例:要查看寄存器的内容,请输入info registers。对于堆栈,应该是什么?

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

平台:Linux和GDB


Answers:


113

info frame 显示堆栈框架信息

要读取给定地址的内存,您应该看一下 x

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


69

用:

  • bt -backtrace:显示堆栈函数和参数
  • info frame -显示堆栈的开始/结束/参数/本地指针
  • 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

55

您需要使用gdb的memory-display命令。基本的是x,供检查。链接到页面上有一个示例使用

gdb> x/4xw $sp

打印“ 以十六进制()w在堆栈指针(此处为$sp)上方的四个单词(x)”。报价略有措辞。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.