我正在学习gdb调试器,我无法回答的一个问题是: 新函数调用导致为它们分配额外的堆栈帧,并且调用堆栈向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的帧并将其返回到内存?可以去声明或longjmp函数让这种情况发生吗?
非常感谢。
答案 0 :(得分:3)
不,中间的帧无法删除,因为调用堆栈是一个堆栈。仅保持指向堆栈顶部的堆栈指针(以及可选地指向最后一帧开头的帧指针)。当帧被“删除”(从函数返回)时,只移动这些指针,下一个分配的帧将覆盖它。
This thread(以及其他一些人)解释了为什么longjmp不能违反这种行为。简而言之,setjmp存储帧位置,但如果帧本身已被覆盖,则会失败。 并且goto不能跳转到不同的功能。