2017-03-02 47 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 –