我一直想了解Visual Studio调试器和一般调试器的内部工作原理。它如何传达和控制您的代码,尤其是当它在主机进程或外部网络服务器(附加到进程)中运行时?编译器或链接器是否使用回调修补代码,以便使调试器获得控制权?如果确实以这种方式工作,那么不包含调试代码的JavaScript之类的解释语言如何工作?
最佳答案
通常,Windows提供了an API来编写调试器,使您可以检查和修改另一个进程中的内存,并在另一个进程中发生异常时获取通知。
调试过程位于一个循环中,等待被检查过程的事件通知。要设置断点,调试器进程会修改被调试者中的代码以引起异常(通常是x86的int 3
指令)。
编译器和链接器一起工作,以使程序的符号信息可用调试器可以读取的格式提供。在Windows上,通常是单独的PDB文件中的CodeView。
在Unix派生的世界中,有一个名为ptrace的API,其功能与Windows调试API基本相同。
对于远程调试,在远程计算机上放置一个小程序,该程序与在本地计算机上运行的实际调试器进行通信并代表该调试器运行。
对于JavaScript之类的解释语言,调试器与解释器一起使用以提供相同种类的功能(检查内存,设置断点等)。
关于debugging - Visual Studio附加到流程如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42563900/