$ fp在gdb中应该等于$ rbp吗?换句话说,帧指针(在gdb术语中)是否等于基指针(在x86术语中)?
根据https://sourceware.org/gdb/onlinedocs/gdb/Registers.html,
$ fp用于包含指向当前堆栈帧的指针的寄存器
在我的C ++程序中,它们不相等(在线程中停止):
(gdb) p $fp
$12 = (void *) 0x7fffffffdae8
(gdb) p $rbp
$13 = (void *) 0x7fffffffdb20
gdb版本是" GNU gdb(GDB)7.12"如果重要
答案 0 :(得分:1)
gdb中的$ fp == $ rbp?
不,因为不是每个处理器都有一个RBP
注册表开始。
将讨论限制在x86_64
,这样做,不,因为GDB文档没有承诺这样的等效性。它承诺$fp
是包含指向当前堆栈帧的指针的寄存器的别名。
根据代码的编译方式以及代码的确切位置,"等效的"寄存器可以是$rbp
,$rsp
,或者根本不存在这样的寄存器。在后一种情况下,GDB似乎“合成”"一个指向本地存储位置的帧指针(如果该函数有任何)。
在使用-fomit-frame-pointer
(例如x86_64
)例行编译代码的机器上,谈论$fp
比讨论实际机器寄存器要少得多