【问题标题】:How does the Visual Studio Attach to Process work?Visual Studio 附加到进程如何工作?
【发布时间】:2017-07-22 16:18:18
【问题描述】:

我一直想知道 Visual Studio 的调试器和一般调试器的内部工作原理。它如何通信和控制您的代码,尤其是当它在主机进程或外部网络服务器(附加到进程)中运行时?编译器或链接器是否使用回调修补您的代码,以便为调试器提供控制权?如果它确实以这种方式工作,那么解释性语言(如不包含调试代码的 JavaScript)如何工作?

【问题讨论】:

    标签: debugging compiler-construction remote-debugging


    【解决方案1】:

    一般来说,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)的代码,以了解有关操作系统之间差异的更多信息。
    • 这个相关问题的一些答案谈到了其他操作系统:stackoverflow.com/questions/216819/…
    【解决方案2】:

    Windows 包括对调试器的支持。进程必须启用调试器权限,一旦完成,该进程可以附加到任何其他进程并使用 Windows 调试器功能对其进行调试

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

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

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

    【讨论】:

    • 如果一个操作系统非常原始并且没有特定的调试工具可供调试器使用,它就不能工作?调试从 DOS 开始就已经存在,我不确定它是否对调试器有任何特定的支持。
    • @ATL_DEV - 问题是某些操作系统限制了调试器的使用。 Windows 不这样做,它允许在任何进程上使用训练器类型的调试器。在实模式下的 DOS 中,不需要任何特权指令,因此 DOS 不需要做任何特殊的事情来允许调试器。 Posix 系统可能有一个可选的调试内核,主要用于调试设备驱动程序。 Windows 使用远程调试,使用两台计算机来调试设备驱动程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2012-01-11
    • 2013-02-24
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多