我正在学习gdb调试器,我无法回答的一个问题是:新函数调用会导致分配给它们的额外堆栈帧,并且调用堆栈向下增长;堆栈帧被卸载并返回到未使用的内存中。是否有可能删除堆栈中间的框架并将其返回内存?可以转到语句或longjmp函数来实现这一点吗?
非常感谢。
发布于 2014-03-13 07:46:42
不,中间的帧不能删除,因为调用堆栈是堆栈。只维护指向堆栈顶部的堆栈指针(以及指向上一帧开头的可选帧指针)。当框架被“删除”(从函数返回)时,只有这些指针被移动,下一个分配的帧将覆盖这个指针。
This thread (和其他几个人)解释了为什么longjmp不能违反这种行为。简而言之,setjmp存储帧位置,但是如果框架本身已被覆盖,则失败。而goto不能跳到不同的功能。
https://stackoverflow.com/questions/22365302
复制相似问题