假設我在代碼的某處放置了一個斷點。調試器是否會讓程序運行到那個點,或者它是否按照指令進行解釋?假定程序使用-g標誌進行編譯。我在問,因爲我的朋友說調試器無法在符號表中保留棧中的變量地址,因此需要解釋。然而,我認爲,至少調試器在輸入函數時知道堆棧變量從堆棧開始的偏移量。調試器解釋代碼還是隻運行它?
回答
假設我在代碼的某處放置了一個斷點。調試器是否會讓程序運行到那個點,或者它是否按照指令進行解釋?
這要看!如果您的系統具有硬件斷點,則簡單地將要斷開的地址寫入硬件寄存器中。如果cpu程序計數器到達其中一個陷阱地址,cpu會生成某種陷阱/ irq/...,它會停止程序並調用調試器的某些功能。
如果您的系統具有可寫內存,但通常沒有硬件斷點,則斷點處的代碼將被替換爲某種在調試器中執行某些功能的陷阱指令。
如果您的執行內存無法寫入,並且沒有可用的硬件斷點,有時可以在單步模式下運行代碼。在每個彙編程序步驟之後,調試器被回調。調試器本身包含斷點列表。
假定程序是使用-g標誌編譯的。我問,因爲我的朋友說,調試器無法保持變量的地址在符號表中的堆棧,因此需要解釋
這是非常錯誤的。調試信息也包含每個堆棧幀的格式。哪些信息/變量/內容放置在堆棧中的哪個位置取決於實際運行的堆棧幀的上下文。調試信息包含所有需要的信息!如果你停止你的程序,調試器知道這個地址,並且可以計算程序的實際上下文/塊。並且調試信息知道哪個堆棧幀內容在此幀處實際使用。
但是,我爭辯說,至少調試器知道輸入函數時從堆棧開始的那些堆棧變量的偏移量。
對!
調試器本身沒有「運行」或「模擬」程序。調試器本身只控制程序在給定系統上的執行方式。該系統也可以是模擬cpu和目標系統的模擬器。在這種情況下,遠程調試也是一個主題。在每一種系統上都需要對系統本身進行調試接口。
AFAIK,GDB「虛擬化」了環境。例如,採取反向執行:您無法「倒轉」真正的CPU。 GDB所做的是跟蹤過程,在最遠點暫停執行,併爲您提供對環境以前狀態的「查看」,直到您返回到實際狀態。
此外,GDB可以交叉 -debug,即在您的系統上運行GDB和在連接的嵌入式系統上運行的調試可執行文件。在這種情況下,GDB甚至沒有在相同的CPU架構上運行......但它不是「解釋」可執行文件(它仍然需要其他系統來實際執行);它是工具它,即跟蹤事情,並允許你暫停和檢查其執行。
-g
所做的是添加調試符號。在發佈代碼中,變量foo
不再是foo
,而只是內存中的一個地址。 使用調試符號,GDB仍然可以知道地址0xdeadbeef
的確是foo
。在堆棧跟蹤中查看函數名稱比地址列表更具啓發性...
(聲明:我遠離GDB grok,當我每天使用它時,我的用途是麪包我確信其他人會出現很多更詳細的答案,甚至指出我錯在哪裏,但在此之前,這是最好的答案我可以給.--))
- 1. 解釋器如何運行代碼?
- 2. 在gdb調試器中運行代碼
- 3. 解釋這個代碼運行一個函數而不明確調用它?
- 4. 運行Python解釋器的Python解釋器:解釋行爲
- 5. VBA代碼只在調試模式下運行時刪除行
- 6. ANTLR解釋器運行誤碼
- 7. python解釋器如何在下面的代碼中逐行運行代碼?
- 8. Visual Studio 2015調試器損壞 - 它是一個錯誤還是隻是我?
- 9. 是否有命令行界面或解釋器運行.net代碼?
- 10. 用本地變量使用python代碼運行python解釋器
- 11. Sublime Text 2 - 在解釋器中運行選定的python代碼
- 12. 感知器代碼解釋
- 13. 瞭解運行時間代碼的解釋和執行
- 14. 這行代碼的解釋?
- 15. 代碼行的解釋
- 16. 解釋這行代碼
- 17. 代碼只能正常運行,如果調試步驟
- 18. Visual Studio調試器 - 它只是我還是這個調試器本身充滿了錯誤?
- 19. Mixtion調試EXE和釋放的編碼器和解碼器
- 20. 遠程測試運行器調試 - 「未找到源代碼」
- 21. Scala有一個解釋器給Scala項目執行它們的選項是編譯還是解釋?
- 22. code :: blocks可以調試代碼但不能運行它
- 23. 它是「代碼」還是「標記」?
- 24. 它是iCloud還是我的代碼?
- 25. 調試解析器生成的代碼
- 26. 調試運行時編譯代碼?
- 27. Javascript代碼僅在調試時運行
- 28. Android - 調試運行緩慢的代碼
- 29. 解釋代碼
- 30. 解釋代碼
它運行代碼,並知道給定當前堆棧指針的堆棧中變量的偏移量。它用於通過覆蓋操作碼來支持斷點,並通過x86上的「INT 3」指令進行中斷,這是調試器的陷阱。我不是100%確信x86_64上的機制。 – slugonamission