Visual Studio 如何使用“附加到进程”功能?

12

我一直想知道Visual Studio的调试器和调试器的内部工作原理,尤其是当代码运行在主机进程或外部网络服务器(附加到进程)中时,它如何通信和控制你的代码?编译器或链接器是否会将回调函数打补丁到你的代码中,以便调试器获得控制权?如果是这样的话,那么包含没有调试代码的JavaScript等解释型语言又是如何工作的呢?

2个回答

13

一般来说,Windows 提供了一个API,用于编写调试器,可以在另一个进程中检查和修改内存,并在另一个进程中发生异常时得到通知。

调试过程处于循环状态,等待来自检测进程的事件通知。要设置断点,调试器进程会修改调试对象中的代码以引发异常 (对于 x86,通常是 int 3 指令)。

编译器和链接器一起工作,以使关于程序的符号信息以可被调试器读取的格式可用。在 Windows 上,这通常是一个单独的 PDB 文件中的 CodeView 符号信息。

在 Unix 派生的世界中,有一个名为 ptrace 的 API,可以做与 Windows 调试 API 基本相同的事情。

对于远程调试,会在远程机器上放置一个小程序,该程序与在本地机器上运行的实际调试器通信并代表其运行。

对于解释型语言,如 JavaScript,调试器与解释器一起工作,提供相同的功能(检查内存,设置断点等)。


Linux和其他更古老的操作系统呢?它们有类似的设施吗? - ATL_DEV
@ATL_DEV:在非Windows操作系统上,调试信息通常使用DWARF嵌入二进制文件中。我不知道其他操作系统上的调试API。问题似乎特别涉及Visual Studio和Windows。您可以研究跨平台开源调试器(如LLDB)的代码,以了解操作系统之间的差异。 - Adrian McCarthy
这个相关问题的一些答案涉及其他操作系统:https://dev59.com/FnVC5IYBdhLWcg3wrDNd?rq=1 - Adrian McCarthy

1

Windows 包含对调试器的支持。一个进程必须启用调试器特权,一旦这样做,该进程就可以使用 Windows 调试器函数附加到任何其他进程并进行调试。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303(v=vs.85).aspx

对于像JavaScript这样的语言,似乎需要一个相当于JavaScript调试器的东西。

在Visual Studio多进程项目中,通常需要切换调试器附加到的进程以调试该进程。我不知道是否有办法同时为多个进程设置待处理断点。可能有其他调试器可以更好地处理多个进程,但我没有使用过这样的工具。


那么,如果一个操作系统非常原始,并且没有特定的调试工具可供调试器使用,它就无法工作吗?自从DOS以来,调试已经存在了,我不确定它是否有任何针对调试器的特定支持。 - ATL_DEV
@ATL_DEV - 问题在于一些操作系统限制了调试器的使用。Windows并没有这样做,这使得训练师类型的调试器可以用于任何进程。在DOS实模式下,不需要特权指令,因此DOS不需要采取任何特殊措施来允许调试器的使用。Posix系统可能有一个可选的调试内核,主要用于调试设备驱动程序。Windows使用远程调试,使用两台计算机来调试设备驱动程序。 - rcgldr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接