我正在尝试学习如何使用 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/