我一直想知道Visual Studio的调试器和调试器的内部工作原理。它如何与代码进行通信和控制,尤其是当它在主机进程或外部网络服务器(附加到进程)中运行时?编译器或链接器是否使用回调修补代码,以便调试器得到控制?如果它确实以这种方式工作,那么解释语言(如不包含调试代码的JavaScript)如何工作?
答案 0 :(得分:6)
一般来说,Windows提供了an API来编写调试器,它允许您检查和修改另一个进程中的内存,并在另一个进程中发生异常时收到通知。
调试过程处于循环中,等待来自正在检查的进程的事件的通知。要设置断点,调试器进程会修改debugee中的代码以导致异常(通常是x86的int 3
指令。)
编译器和链接器协同工作,使程序的符号信息以可由调试器读取的格式提供。在Windows上,这通常是单独的PDB文件中的CodeView。
在Unix派生的世界中,有一个名为ptrace的API,它与Windows调试API基本上具有相同的功能。
对于远程调试,在远程计算机上放置一个小程序,该程序与本地计算机上运行的实际调试程序通信并起作用。
对于像JavaScript这样的解释语言,调试器与解释器一起使用,以提供相同类型的功能(检查内存,设置断点等)。
答案 1 :(得分:1)
Windows包括对调试器的支持。进程必须启用调试器权限,一旦完成,该进程可以附加到任何其他进程并使用Windows调试器函数对其进行调试
http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303(v=vs.85).aspx
对于像javascript这样的东西,似乎你需要相当于一个javascript调试器。
对于Visual Studio多进程项目,通常必须切换调试器附加到哪个进程才能调试该进程。我不知道是否有办法同时为多个进程设置挂起断点。可能有其他调试器可以更好地处理多个进程,但我还没有使用过这样的工具。