gdb中是$ fp == $ rbp吗?

时间:2017-10-30 03:54:47

标签: c++ gdb

$ 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"如果重要

1 个答案:

答案 0 :(得分:1)

  

gdb中的$ fp == $ rbp?

不,因为不是每个处理器都有一个RBP注册表开始。

将讨论限制在x86_64,这样做,不,因为GDB文档没有承诺这样的等效性。它承诺$fp是包含指向当前堆栈帧的指针的寄存器的别名。

根据代码的编译方式以及代码的确切位置,"等效的"寄存器可以是$rbp$rsp,或者根本不存在这样的寄存器。在后一种情况下,GDB似乎“合成”"一个指向本地存储位置的帧指针(如果该函数有任何)。

在使用-fomit-frame-pointer(例如x86_64)例行编译代码的机器上,谈论$fp比讨论实际机器寄存器要少得多