2016-10-09 50 views
1

在gdb中,當在一個函數內部進行調試時,我們可以使用「finish」命令來運行到一個函數的末尾。gdb使用什麼機制知道「完成」函數調用的位置?

我的問題是:gdb如何知道函數的結束位置,特別是當沒有調試符號來匹配源代碼「{}」時?

我猜gdb在x86下尋找「leave」或「mov%rbp,%rsp,pop%rbp」以判斷它是否已經到達函數的末尾。

但問題是,

(1)仍然需要在函數調用的開始/結束推/流行,這取決於源代碼和ABI結構一些額外的寄存器。

(2)需要push/pop的寄存器的數量在編譯階段決定,恐怕這個「number」信息不可用拋出二進制可執行文件。

那麼,gdb如何確定,函數調用的結束在哪裏,以便「完成」命令可以跳轉到它?

謝謝!

回答

3

gdb不會嘗試分析機器碼。相反,它解開堆棧,找到調用者的PC,並在那裏設置臨時斷點。然後它讓劣勢運行,直到斷點被擊中。

由於gdb的開卷機的設計方式,這也會自動從內聯函數中處理finish(儘管由於這種情況在代碼中還有一些特殊情況)。

相關問題