我一直都想知道Visual Studio的调试器和调试器的内部工作原理。它如何能够与您的代码进行通信并对其进行控制,特别是当它在另一个应用程序或服务器上的外部运行时(附加到进程)?编译器或链接器是否修补你的代码,以便调试器被赋予控制权?此外,如果这是如何工作的,那么对于JavaScript等语言而言,这种方式如何工作,而不需要修补任何物理文件?Visual Studio如何连接到进程?
回答
Windows包含对调试器的支持。进程具有使调试特权,一旦这样做这一过程可以附加到任何其他进程,并使用Windows调试功能
http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303(v=vs.85).aspx
对于一些像JavaScript,好像你将需要相当于对其进行调试一个JavaScript调试器。
对于Visual Studio多进程项目,您通常必须切换调试程序所连接的进程以调试该进程。我不知道是否有办法在同一时间为多个进程设置挂起的断点。还有其他的调试器可以在多个进程中更好地工作,但我没有使用过这样的工具。
一般来说,Windows提供an API用于编写调试器,使您可以检查和修改另一个进程中的内存,并在另一个进程中发生异常时收到通知。
调试进程位于一个循环中,等待来自正在检查的进程的事件的通知。要设置断点,调试器进程会修改恶人中的代码以导致异常(通常,x86的int 3
指令)。
编译器和链接器一起工作,使得程序的符号信息可用调试器可以读取的格式提供。在Windows上,这通常是单独的PDB文件中的CodeView。
在Unix派生的世界中,有一个名为ptrace的API,其功能与Windows调试API基本相同。
对于远程调试,在远程机器上放置一个小程序,该程序与本地机器上运行的实际调试器进行通信并执行操作。
对于解释型语言,如JavaScript,调试器与解释器一起工作,以提供相同类型的功能(检查内存,设置断点等)。
Linux和其他更古老的操作系统呢?他们有类似的设施吗? –
@ATL_DEV:在非Windows操作系统上,通常使用DWARF将调试信息嵌入到二进制文件中。我不知道在其他操作系统上调试API。这个问题似乎是关于Visual Studio和Windows的具体问题。您可以研究跨平台开源调试器(如LLDB)的代码,以了解有关操作系统之间差异的更多信息。 –
这个相关的问题的一些答案谈到其他操作系统:http://stackoverflow.com/questions/216819/how-does-a-debugger-work?rq=1 –
- 1. 以名称连接到Visual Studio进程
- 2. 如何将Visual Studio连接到SQL Server?
- 3. 如何将DB2连接到Visual Studio 2010
- 4. 如何从Visual Studio 11连接到WWAHOST
- 5. Visual Studio命令窗口 - 连接到远程进程?
- 6. 如何从Visual Studio 2012 Express连接到Visual Studio Online
- 7. 如何将Visual Studio 2008连接到Team Foundation Service和Visual Studio Online?
- 8. 找到连接由Visual Studio
- 9. 将Visual Studio连接到MySQL
- 10. visual studio连接到sql server
- 11. Visual Studio C++连接到DB2
- 12. 连接到使用Visual Studio
- 13. Visual Studio 2017连接到错误的w3wp进程
- 14. 使用Microsoft Visual Studio连接到Linux进程?
- 15. 当连接到进程时,Visual Studio不能识别aspnet_wp.exe
- 16. 当连接到进程时,Visual Studio 2005被锁定
- 17. 当连接到进程时,Visual Studio不加载模块
- 18. 如何连接到进程
- 19. 如何从Visual Studio for Mac连接到远程SQL Server?
- 20. Visual Studio - 附加到进程
- 21. 连接到MS Access到Visual Studio
- 22. 如何在Visual Studio中连接库
- 23. 无法再使用Visual Studio 2008连接到Visual Studio Team Services
- 24. Visual Studio 2012:无法附加进程。调试器已经连接
- 25. 无法连接到Mac在Visual Studio
- 26. 从Visual Studio连接到SQL Server CE
- 27. 麻烦连接Visual Studio到MySQL
- 28. Visual Studio 2008到MySQL的连接
- 29. 使用Visual Studio和NUnit连接到localdb
因此,如果一个操作系统是非常原始的,并没有特定的调试工具可用于调试器,它将无法正常工作?自DOS以来,调试一直存在,我不确定它对调试器有任何特定的支持。 –
@ATL_DEV - 问题在于某些操作系统限制了调试器的使用。 Windows不这样做,它允许教练类型调试器用于任何进程。在实模式下的DOS情况下,不需要任何特权指令,所以DOS不需要做任何特殊的事情来允许调试器。 Posix系统可能有一个可选的调试内核,主要用于调试设备驱动程序。 Windows使用两台计算机进行远程调试来调试设备驱动程序。 – rcgldr