4
我正在学习gdb调试器,我无法回答的一个问题是: 新的函数调用会为其分配额外的堆栈帧,并且调用堆栈会向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的一个帧并将其返回到内存?可以去声明或longjmp函数做到这一点?从堆栈中间展开堆栈
非常感谢。
我正在学习gdb调试器,我无法回答的一个问题是: 新的函数调用会为其分配额外的堆栈帧,并且调用堆栈会向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的一个帧并将其返回到内存?可以去声明或longjmp函数做到这一点?从堆栈中间展开堆栈
非常感谢。
不,中间的帧不能被删除,因为调用堆栈是一个堆栈。只有指向堆栈顶部的堆栈指针(以及可选的指向最后一帧开始的帧指针)被保留。当帧被“删除”(从函数返回)时,只有这些指针被移动,下一个分配的帧将覆盖这个。
This thread(和其他几个人)解释了为什么longjmp不能违反此行为。简而言之,setjmp存储帧位置,但是如果帧本身被覆盖,则失败。 转到不能跳转到不同的功能。
非常感谢您的回答以及关于longjmp的参考资料。 –