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