我正在学习 gdb 调试器,我无法回答的一个问题是:新函数调用导致为它们分配额外的堆栈帧,并且调用堆栈向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的帧并返回内存?go to statement 或 longjmp 函数可以实现吗?
非常感谢。
我正在学习 gdb 调试器,我无法回答的一个问题是:新函数调用导致为它们分配额外的堆栈帧,并且调用堆栈向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的帧并返回内存?go to statement 或 longjmp 函数可以实现吗?
非常感谢。
不,中间的frame不能删除,因为调用栈是一个栈。仅维护指向堆栈顶部的堆栈指针(以及指向最后一帧开头的可选帧指针)。由于帧被“删除”(从函数返回),只有这些指针被移动,下一个分配的帧将覆盖它。
这个线程(以及其他几个线程)解释了为什么 longjmp 不能违反这种行为。简而言之,setjmp 存储帧位置,但如果帧本身已被覆盖,则此操作失败。goto 不能跳转到不同的函数。