c++ - 访问旧的堆栈帧

标签 c++ gdb

如果我理解正确的话,每次调用 C++ 函数时,SP(可能还有 BP)都会移动以在堆栈上分配一些临时空间 - 堆栈帧。当函数返回时,指针被移回,再次释放堆栈帧。

但在我看来,旧堆栈帧上的数据仍然存在,只是不再被引用。有什么方法可以让 GDB 向我显示这些已删除的堆栈帧吗? (显然,一旦您输入堆栈帧,它至少会部分覆盖以前的任何堆栈帧......但在那之前,它似乎应该是可能的。)

最佳答案

But it appears to me that the data on the old stack frame is still there, it's just not referenced any more.

正确。

Is there some way to make GDB show me these deleted stack frames?

您可以使用 GDB examine 命令轻松查看未使用的堆栈。例如:

void fn()
{
  int x[100];
  for (int j = 0; j < 100; j++) x[j] = (0x1234 << 12) + j;
}


int main()
{
  fn();
  return 0;
}

构建和调试:

gcc -g t.c
gdb -q ./a.out

(gdb) start
Temporary breakpoint 1 at 0x115f: file t.c, line 10.
Starting program: /tmp/a.out 

Temporary breakpoint 1, main () at t.c:10
10    fn();
(gdb) n
11    return 0;
(gdb) x/40x $rsp-0x40
0x7fffffffdc60: 0x0123405c  0x0123405d  0x0123405e  0x0123405f
0x7fffffffdc70: 0x01234060  0x01234061  0x01234062  0x01234063
0x7fffffffdc80: 0x55555170  0x00005555  0x55555040  0x00000064
0x7fffffffdc90: 0xffffdca0  0x00007fff  0x55555169  0x00005555
0x7fffffffdca0: 0x55555170  0x00005555  0xf7a3a52b  0x00007fff
0x7fffffffdcb0: 0x00000000  0x00000000  0xffffdd88  0x00007fff
0x7fffffffdcc0: 0x00080000  0x00000001  0x5555515b  0x00005555
0x7fffffffdcd0: 0x00000000  0x00000000  0xa91c6994  0xc8f4292d
0x7fffffffdce0: 0x55555040  0x00005555  0xffffdd80  0x00007fff
0x7fffffffdcf0: 0x00000000  0x00000000  0x00000000  0x00000000

在这里,您可以清楚地看到 x 仍在堆栈中:0x7fffffffdc60x[92] 曾经所在的位置,0x7fffffffdc70x[96] 曾经所在的位置,等等

但是,没有简单的方法可以让 GDB 解释该数据为 fn 的本地数据。

关于c++ - 访问旧的堆栈帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58096443/

相关文章:

c++ - C++中的抽象类和构造函数

c++ - 如何正确地从 vector 的一部分中找到一个值?

c++ - GDB 显示文件名 : no cpp file

c - 从调试符号获取变量的堆栈偏移量

python - 检查 gdb pretty-print 中的内存

c++ - 用天空盒程序生成星星

c++ - 在 C++ 中,如何找到直接或间接链接到数组特定元素的数组的所有元素?

c++ - 如何判断一个对象是否是特征类型?

c++ - 我可以使用使用调试符号重新编译的相同二进制文件来调试由没有调试符号的 C++ 二进制文件生成的内核吗

gdb - 如何在stm32cubeide中启动GDB服务器?