gpt4 book ai didi

c++ - 访问旧堆栈帧

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:32 25 4
gpt4 key购买 nike

如果我没理解错的话,每次调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com