2014-03-12 223 views
4

我正在學習gdb調試器,我無法回答的一個問題是: 新的函數調用會爲其分配額外的堆棧幀,並且調用堆棧會向下增長;堆棧幀被釋放並返回到未使用的內存。是否有可能刪除堆棧中間的一個幀並將其返回到內存?可以去聲明或longjmp函數做到這一點?從堆棧中間展開堆棧

非常感謝。

回答

3

不,中間的幀不能被刪除,因爲調用堆棧是一個堆棧。只有指向堆棧頂部的堆棧指針(以及可選的指向最後一幀開始的幀指針)被保留。當幀被「刪除」(從函數返回)時,只有這些指針被移動,下一個分配的幀將覆蓋這個。

This thread(和其他幾個人)解釋了爲什麼longjmp不能違反此行爲。簡而言之,setjmp存儲幀位置,但是如果幀本身被覆蓋,則失敗。 轉到不能跳轉到不同的功能。

+0

非常感謝您的回答以及關於longjmp的參考資料。 –