我一直都想知道Visual Studio的調試器和調試器的內部工作原理。它如何能夠與您的代碼進行通信並對其進行控制,特別是當它在另一個應用程序或服務器上的外部運行時(附加到進程)?編譯器或鏈接器是否修補你的代碼,以便調試器被賦予控制權?此外,如果這是如何工作的,那麼對於JavaScript等語言而言,這種方式如何工作,而不需要修補任何物理文件?Visual Studio如何連接到進程?
回答
Windows包含對調試器的支持。進程具有使調試特權,一旦這樣做這一過程可以附加到任何其他進程,並使用Windows調試功能
http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303(v=vs.85).aspx
對於一些像JavaScript,好像你將需要相當於對其進行調試一個JavaScript調試器。
對於Visual Studio多進程項目,您通常必須切換調試程序所連接的進程以調試該進程。我不知道是否有辦法在同一時間爲多個進程設置掛起的斷點。還有其他的調試器可以在多個進程中更好地工作,但我沒有使用過這樣的工具。
一般來說,Windows提供an API用於編寫調試器,使您可以檢查和修改另一個進程中的內存,並在另一個進程中發生異常時收到通知。
調試進程位於一個循環中,等待來自正在檢查的進程的事件的通知。要設置斷點,調試器進程會修改惡人中的代碼以導致異常(通常,x86的int 3
指令)。
編譯器和鏈接器一起工作,使得程序的符號信息可用調試器可以讀取的格式提供。在Windows上,這通常是單獨的PDB文件中的CodeView。
在Unix派生的世界中,有一個名爲ptrace的API,其功能與Windows調試API基本相同。
對於遠程調試,在遠程機器上放置一個小程序,該程序與本地機器上運行的實際調試器進行通信並執行操作。
對於解釋型語言,如JavaScript,調試器與解釋器一起工作,以提供相同類型的功能(檢查內存,設置斷點等)。
Linux和其他更古老的操作系統呢?他們有類似的設施嗎? –
@ATL_DEV:在非Windows操作系統上,通常使用DWARF將調試信息嵌入到二進制文件中。我不知道在其他操作系統上調試API。這個問題似乎是關於Visual Studio和Windows的具體問題。您可以研究跨平臺開源調試器(如LLDB)的代碼,以瞭解有關操作系統之間差異的更多信息。 –
這個相關的問題的一些答案談到其他操作系統:http://stackoverflow.com/questions/216819/how-does-a-debugger-work?rq=1 –
- 1. 以名稱連接到Visual Studio進程
- 2. 如何將Visual Studio連接到SQL Server?
- 3. 如何將DB2連接到Visual Studio 2010
- 4. 如何從Visual Studio 11連接到WWAHOST
- 5. Visual Studio命令窗口 - 連接到遠程進程?
- 6. 如何從Visual Studio 2012 Express連接到Visual Studio Online
- 7. 如何將Visual Studio 2008連接到Team Foundation Service和Visual Studio Online?
- 8. 找到連接由Visual Studio
- 9. 將Visual Studio連接到MySQL
- 10. visual studio連接到sql server
- 11. Visual Studio C++連接到DB2
- 12. 連接到使用Visual Studio
- 13. Visual Studio 2017連接到錯誤的w3wp進程
- 14. 使用Microsoft Visual Studio連接到Linux進程?
- 15. 當連接到進程時,Visual Studio不能識別aspnet_wp.exe
- 16. 當連接到進程時,Visual Studio 2005被鎖定
- 17. 當連接到進程時,Visual Studio不加載模塊
- 18. 如何連接到進程
- 19. 如何從Visual Studio for Mac連接到遠程SQL Server?
- 20. Visual Studio - 附加到進程
- 21. 連接到MS Access到Visual Studio
- 22. 如何在Visual Studio中連接庫
- 23. 無法再使用Visual Studio 2008連接到Visual Studio Team Services
- 24. Visual Studio 2012:無法附加進程。調試器已經連接
- 25. 無法連接到Mac在Visual Studio
- 26. 從Visual Studio連接到SQL Server CE
- 27. 麻煩連接Visual Studio到MySQL
- 28. Visual Studio 2008到MySQL的連接
- 29. 使用Visual Studio和NUnit連接到localdb
因此,如果一個操作系統是非常原始的,並沒有特定的調試工具可用於調試器,它將無法正常工作?自DOS以來,調試一直存在,我不確定它對調試器有任何特定的支持。 –
@ATL_DEV - 問題在於某些操作系統限制了調試器的使用。 Windows不這樣做,它允許教練類型調試器用於任何進程。在實模式下的DOS情況下,不需要任何特權指令,所以DOS不需要做任何特殊的事情來允許調試器。 Posix系統可能有一個可選的調試內核,主要用於調試設備驅動程序。 Windows使用兩臺計算機進行遠程調試來調試設備驅動程序。 – rcgldr