使用GDB(x86)检查堆栈

时间:2012-01-25 16:46:46

标签: assembly gdb x86 stack frame

所以我正在使用GDB调试x86程序。我在一个名为func1的函数中。

我想检查堆栈并查看传递给它的参数。所以通过以下方式:

(gdb) info frame 0
Stack frame at 0x7fffffffe1f0:
 rip = 0x400e70 in func4; saved rip 0x40115a
 called by frame at 0x7fffffffe210
 Arglist at 0x7fffffffe1e0, args: 
 Locals at 0x7fffffffe1e0, Previous frame's sp is 0x7fffffffe1f0
 Saved registers:
  rip at 0x7fffffffe1e8

我知道论点在0x7fffffffe1e0。通过做:

(gdb) x/8x 0x7fffffffe1e0
0x7fffffffe1e0: 0x08    0xe3    0xff    0xff    0xff    0x7f    0x00    0x00

那么为什么这个地址包含所有那些十六进制数?这些是什么?另外我怎么知道有多少参数?执行信息本地信息或信息参数表示没有加载符号表。

另外,我知道第一个参数是0x7fffffffe1e0 + 0x8,第二个参数是0x7fffffffe1e0 + 0xc等......但我怎么知道有多少个参数?

通过做:

(gdb) x 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 0x5a
(gdb) x/d 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 90
(gdb) x/c 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 90 'Z'

我知道第一个参数是Z或90.有没有办法弄清楚它是哪一个?

通过做

(gdb) x 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4: -1 '\377'
(gdb) x/s 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4:  "\377\177"
(gdb) x/d 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4: -1

我知道第二个参数可能是-1。

否则

(gdb) x 0x7fffffffe1e8 + 0x10
0x7fffffffe1f8: 10

我知道第三个论点“可能”是10。

那么我怎么知道有多少参数呢?如果我找到一个数字或一个字符,有没有办法确定它是哪一个?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

我想检查堆栈并查看传递给它的参数。

你显然是在x86_64平台上。

您应该学习使用的调用约定。特别要注意的是,函数参数是在堆栈上传递(除非你有超过6个),所以你的问题从错误的假设开始。

无法检查堆栈以查看参数,因为它们不是从那里开始的。