所以我正在使用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。
那么我怎么知道有多少参数呢?如果我找到一个数字或一个字符,有没有办法确定它是哪一个?
谢谢!
答案 0 :(得分:3)
我想检查堆栈并查看传递给它的参数。
你显然是在x86_64平台上。
您应该学习使用的调用约定。特别要注意的是,函数参数是不在堆栈上传递(除非你有超过6个),所以你的问题从错误的假设开始。
你无法检查堆栈以查看参数,因为它们不是从那里开始的。