1
在gdb中,當在一個函數內部進行調試時,我們可以使用「finish」命令來運行到一個函數的末尾。gdb使用什麼機制知道「完成」函數調用的位置?
我的問題是:gdb如何知道函數的結束位置,特別是當沒有調試符號來匹配源代碼「{}」時?
我猜gdb在x86下尋找「leave」或「mov%rbp,%rsp,pop%rbp」以判斷它是否已經到達函數的末尾。
但問題是,
(1)仍然需要在函數調用的開始/結束推/流行,這取決於源代碼和ABI結構一些額外的寄存器。
(2)需要push/pop的寄存器的數量在編譯階段決定,恐怕這個「number」信息不可用拋出二進制可執行文件。
那麼,gdb如何確定,函數調用的結束在哪裏,以便「完成」命令可以跳轉到它?
謝謝!