【发布时间】:2019-09-25 10:33:56
【问题描述】:
如果我的理解是正确的,那么每次调用 C++ 函数时,SP(可能还有 BP)都会移动以在堆栈上分配一些临时空间——堆栈帧。当函数返回时,指针被移回,再次释放堆栈帧。
但在我看来,旧堆栈帧上的数据仍然存在,只是不再被引用。有什么方法可以让 GDB 向我展示这些已删除的堆栈帧吗? (很明显,一旦你进入一个 new 堆栈帧,它至少会部分覆盖任何以前的堆栈帧......但在那之前它似乎应该是可能的。)
【问题讨论】:
-
确实如此。您可以通过在从子函数返回后查看调试器中的堆栈内存来验证这一点。但是,很难知道什么在哪里,因为您不再有匹配的堆栈和/或基指针。
-
“进入一个新的堆栈帧”到底是什么意思?将堆栈指针更改为更高的帧本身不会破坏您离开的帧中的数据,但是您不必再次向下帧以使旧帧被破坏 - 这可能是由于操作而发生的上层帧(如被调用函数返回后分配1000字节的“栈内存”)。
-
您不能扫描堆栈以查找与其中包含代码的内存地址一致的 64 位数字吗? (即,可能是返回地址的数字。)