linux - C 程序将 $rbp+4 中的函数参数存储在内存中?我的检查失败

标签 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

这里我知道“argc”应该是 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

我没有找到任何线索表明 $rbp+xBytes 中的任何字节中都保存了双字“3”。我的理解或命令有什么错误吗?

谢谢!

最佳答案

I was trying to learn how to use rbp/ebp to visit function parameters and local variables

x86_64 ABI 使用堆栈传递参数吗?它们在寄存器中传递。因此,您不会在 $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

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

关于linux - C 程序将 $rbp+4 中的函数参数存储在内存中?我的检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39715353/

相关文章:

regex - 删除 key :value pair from json file using shell script

c++ - 在 reading/dev/fb0 上没有得到预期的输出

Jquery 将字符串作为参数出现问题

linux - initctl 中的作业是什么意思以及如何使用它?

c - c语言中如何将代码分成函数

c++ - 无法从用户定义的函数中获取值

函数定义包含单元 F#

c++ - 引用指针的可选参数?

angular - 错误 : Cannot match any routes, URL 段未定义

c++ - 您如何以编程方式确定二进制输出中的构建系统等效性?