2013-05-16 39 views
3

通過添加中斷點進行調試時,可以通過運行bt來查看堆棧幀。gdb如何從堆棧中的所有幀中找到所有寄存器的值

通過運行信息寄存器來選擇幀時,可以看到特定幀上寄存器的值。

例如,考慮在第5幀上設置斷點。當中斷點被打到第3幀時,可以看到視圖寄存器值。

gdb如何在第5幀設置斷點時從第3幀獲取寄存器值?

回答

6

它依靠編譯器生成的調試信息來恢復(一些)寄存器值作爲堆棧展開過程的一部分。

http://gnu.wildebeest.org/blog/mjw/2007/08/23/stack-unwinding/

爲了幫助調試器仍然可以得到放鬆的 棧和恢復所有必要的寄存器由編譯器生成的調試信息 (矮)擴大到包括呼叫框 信息所需的所有信息(CFI ),允許調試器重新構造調用PC 和函數的寄存器(請參閱DWARF 3規範 - 第6.4節)。

對於相對容易遵循矮棧展開的執行,看到_Unwind_Backtrace() libgcc中。這正在進行中,而不是像GDB那樣的進程。

+0

感謝Scott的回覆。 – Tectrendz

0

它依賴於frame pointer,並從堆棧中獲取保存的寄存器值。

+0

嗨尼古拉,感謝您的關注。 GDB的所有寄存器值在哪裏?幀指針用於堆棧幀,但gdb顯示所有寄存器值。 – Tectrendz

+1

在他的回答中查看堆棧展開信息@scottt提及。基本上,幀指針地址給定堆棧幀,當前函數保存可能被下一次調用破壞的寄存器值(包括幀指針本身)。 DWARF調試信息描述它們的位置。 –

相關問題