C程序在内存中存储$ rbp + 4的函数参数?我的支票失败了

时间:2016-09-27 03:04:56

标签: linux function parameters gdb rbp

我试图学习如何使用rbp / ebp访问ubuntu1604,64bit上的函数参数和局部变量。我有一个简单的c文件:

#include<stdio.h>
int main(int argc,char*argv[])
{
  printf("hello\n");
  return argc;
}

我编译它:

  

gcc -g my.c

然后使用参数参数调试它:

  

gdb --args my 01 02

在这里,我知道&#34; argc&#34;应该是3,所以我试着检查:

(gdb) b main
Breakpoint 1 at 0x400535: file ret.c, line 5.
(gdb) r
Starting program: /home/a/cpp/my 01 02

Breakpoint 1, main (argc=3, argv=0x7fffffffde98) at ret.c:5
5     printf("hello\n");
(gdb) x $rbp+4
0x7fffffffddb4: 0x00000000
(gdb) x $rbp+8
0x7fffffffddb8: 0xf7a2e830
(gdb) x/1xw $rbp+8
0x7fffffffddb8: 0xf7a2e830
(gdb) x/1xw $rbp+4
0x7fffffffddb4: 0x00000000
(gdb) x/1xw $rbp
0x7fffffffddb0: 0x00400550

我没有找到关于&#34; 3&#34;的双关语的任何线索。保存在$ rbp + xBytes中的任何字节中。我的理解或命令是否有任何错误?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

我试图学习如何使用rbp / ebp来访问函数参数和局部变量

var agent = chai.request.agent(server); return agent.post('/api/v1/account/login') ... ABI 使用堆栈传递参数;它们通过寄存器传递。因此,您无法在x86_64之外的任何偏移处找到它们(这与$rbp调用约定不同。)

要查找参数,您需要查看ix86$rdi群组:

$rsi
  

Breakpoint 1, main (argc=3, argv=0x7fffffffe3a8) at my.c:4 4 printf("hello\n"); (gdb) p/x $rdi $1 = 0x3 # matches argc (gdb) p/x $rsi $2 = 0x7fffffffe3a8 # matches argv

几乎肯定x $rbp+4找不到任何有用的东西,因为它通常递增或递减8,以便存储整个64位值。