2017-03-02 92 views
2

我一直都想知道Visual Studio的調試器和調試器的內部工作原理。它如何能夠與您的代碼進行通信並對其進行控制,特別是當它在另一個應用程序或服務器上的外部運行時(附加到進程)?編譯器或鏈接器是否修補你的代碼,以便調試器被賦予控制權?此外,如果這是如何工作的,那麼對於JavaScript等語言而言,這種方式如何工作,而不需要修補任何物理文件?Visual Studio如何連接到進程?

回答

0

Windows包含對調試器的支持。進程具有使調試特權,一旦這樣做這一過程可以附加到任何其他進程,並使用Windows調試功能

http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303(v=vs.85).aspx

對於一些像JavaScript,好像你將需要相當於對其進行調試一個JavaScript調試器。

對於Visual Studio多進程項目,您通常必須切換調試程序所連接的進程以調試該進程。我不知道是否有辦法在同一時間爲多個進程設置掛起的斷點。還有其他的調試器可以在多個進程中更好地工作,但我沒有使用過這樣的工具。

+0

因此,如果一個操作系統是非常原始的,並沒有特定的調試工具可用於調試器,它將無法正常工作?自DOS以來,調試一直存在,我不確定它對調試器有任何特定的支持。 –

+0

@ATL_DEV - 問題在於某些操作系統限制了調試器的使用。 Windows不這樣做,它允許教練類型調試器用於任何進程。在實模式下的DOS情況下,不需要任何特權指令,所以DOS不需要做任何特殊的事情來允許調試器。 Posix系統可能有一個可選的調試內核,主要用於調試設備驅動程序。 Windows使用兩臺計算機進行遠程調試來調試設備驅動程序。 – rcgldr

1

一般來說,Windows提供an API用於編寫調試器,使您可以檢查和修改另一個進程中的內存,並在另一個進程中發生異常時收到通知。

調試進程位於一個循環中,等待來自正在檢查的進程的事件的通知。要設置斷點,調試器進程會修改惡人中的代碼以導致異常(通常,x86的int 3指令)。

編譯器和鏈接器一起工作,使得程序的符號信息可用調試器可以讀取的格式提供。在Windows上,這通常是單獨的PDB文件中的CodeView。

在Unix派生的世界中,有一個名爲ptrace的API,其功能與Windows調試API基本相同。

對於遠程調試,在遠程機器上放置一個小程序,該程序與本地機器上運行的實際調試器進行通信並執行操作。

對於解釋型語言,如JavaScript,調試器與解釋器一起工作,以提供相同類型的功能(檢查內存,設置斷點等)。

+0

Linux和其他更古老的操作系統呢?他們有類似的設施嗎? –

+0

@ATL_DEV:在非Windows操作系統上,通常使用DWARF將調試信息嵌入到二進制文件中。我不知道在其他操作系統上調試API。這個問題似乎是關於Visual Studio和Windows的具體問題。您可以研究跨平臺開源調試器(如LLDB)的代碼,以瞭解有關操作系統之間差異的更多信息。 –

+0

這個相關的問題的一些答案談到其他操作系統:http://stackoverflow.com/questions/216819/how-does-a-debugger-work?rq=1 –