使用 Visual Studio 调试器附加到运行的进程

本主题演示如何附加到正在运行的进程、附加到远程计算机上的进程和附加错误故障排除。

为什么调试附加进程?

Visual Studio 调试器可以附加到在 Visual Studio 外运行的进程。 可以使用此附加功能执行以下操作:

  • 调试并非在 Visual Studio 中创建的应用程序。

  • 同时调试多个进程。 也可以通过在单个解决方案内启动多个项目来调试多个进程。

  • 调试正在远程计算机上运行的进程。

  • 调试一个 DLL,该 DLL 运行在不易从 Visual Studio 启动的独立进程上。例如,与 Internet 信息服务一起运行的服务或 ISAPI DLL。

  • 当一个进程在 Visual Studio 外运行时发生崩溃时,将自动启动调试器。 这就是实时调试。

一旦附加到某个程序,就可以使用调试器执行命令、检查程序状态,等等。 有关更多信息,请参见 在 Visual Studio 中调试一个或多个进程在 Visual Studio 中启动、中断、单步执行、通过代码运行和停止调试查看调试器中的数据。 检查程序的能力可能会受到某些限制,这取决于程序是否用调试信息生成,是否可以访问程序源代码,以及公共语言运行时 JIT 编译器是否在跟踪调试信息。

C++ 说明C++ 说明

为使调试器附加到用 C++ 编写的代码,该代码需要发出 DebuggableAttribute。可通过链接 /ASSEMBLYDEBUG 链接器选项将它自动添加到代码中。

警告

若要附加到用 JavaScript 编写的 Windows 应用商店应用,你必须先为该应用启用调试。请参阅 Windows 开发人员中心中的Attach the debugger

附加到正在运行的进程

  1. 在**“调试”菜单上,选择“附加到进程”**。

  2. 在**“附加到进程”对话框中的“可用进程”**列表中,找到要附加到的程序。

    1. 如果要调试的程序在另一台计算机上运行,则使用**“限定符”**列表框来选择或指定远程计算机。 有关详细信息,请参阅远程调试和诊断

    2. 如果进程在其他用户帐户下运行,请选中**“显示所有用户的进程”**复选框。

    3. 如果是通过**“远程桌面连接”连接,请选中“显示所有会话中的进程”**复选框。

  3. 在“附加到”框中,确保待调试的代码类型已经列出。 默认的**“自动”**设置尝试确定要调试的代码类型。 如果自动设置不合适:

    1. 单击**“选择”**。

    2. 在**“选择代码类型”对话框中,单击“调试以下代码类型”**,然后选择要调试的类型。

    3. 单击“确定”。

  4. 单击**“附加”**。

    打开**“进程”对话框时,会自动显示“可用进程”列表。 在该对话框打开时进程可以在后台启动和停止。 不过,内容并非总是最新的。 通过单击“刷新”**,可以随时刷新列表以查看当前进程列表。

    调试时可以附加到多个程序,但在任何时间,调试器中都只有一个程序处于活动状态。 可以在**“调试位置”工具栏或“进程”**窗口中设置活动程序。

    备注

    若要使调试器附加到用 C++/CLI 编写的托管代码,该代码必须发出 DebuggableAttribute。可通过链接 /ASSEMBLYDEBUG 链接器选项将它自动添加到代码中。

    如果尝试附加到不受信任的用户帐户拥有的进程,则会出现安全警告对话框确认。 有关更多信息,请参见安全警告: 附加到不受信任的用户拥有的进程可能很危险。如果下面的信息看上去可疑或无法确定,请不要附加到此进程

    在某些情况下,在“远程桌面”(“终端服务”)会话中进行调试时,**“可用进程”**列表不会显示所有可用进程。 在 Windows Server 2003 或更高版本中,如果你以具有有限用户帐户的用户身份运行 Visual Studio,“可用进程”列表将不显示在会话 0 中运行的进程,会话 0 用于服务与其他服务器进程,包括 w3wp.exe。 你可以通过以下方法解决该问题:在管理员帐户下运行 Visual Studio 或从服务器控制台而不是“终端服务”会话运行 Visual Studio。 如果这两种解决方法都不奏效,第三种方法是通过从 Windows 命令行运行 vsjitdebugger.exe -p ProcessId 来附加到进程。 你可以使用 tlist.exe 来确定进程 ID。 若要获取 tlist.exe,请从 https://go.microsoft.com/fwlink/?LinkId=168279 下载并安装 Windows 调试工具。

若要停止调试附加的进程,请单击“调试/停止调试”,或停止运行附加的进程。

附加到远程计算机上的进程

当使用**“附加到进程”**对话框时,你可以选择另一台已经针对远程调试进行设置的计算机。 有关详细信息,请参阅在设备上安装远程工具。 选择了一台远程计算机后,可以查看该计算机上运行的可用进程的列表,并附加到一个或多个进程以进行调试。

选择远程计算机:

  1. 在**“附加到进程”对话框中,从“传输”列表中选择适当的连接类型。 对于大部分程序来说,“默认”**是正确的设置。

  2. 使用**“限定符”**列表框通过以下方法之一选择远程计算机名称:

    1. 在**“限定符”**列表框中键入名称。

    2. 单击附加到**“限定符”**列表框的下拉箭头,然后从下拉列表中选择计算机名称。

    3. 单击“限定符”列表旁边的“查找”按钮,以打开“选择远程调试器连接”对话框。 “选择远程调试器连接”对话框将列出本地子网上的所有设备和通过以太网电缆直接连接到你的计算机的任何设备。 单击所需的计算机或设备,然后单击“选择”

    **“传输”**设置在调试会话之间保持。 **“限定符”**设置只有相应的限定符发生了成功的调试连接时才会在调试会话之间保持。

纠正附加错误

当调试器附加到一个正在运行的进程时,该进程可能包含一种或多种类型的代码。 可在**“选择代码类型”**对话框中显示并选择可将调试器附加到的代码类型。

备注

为使调试器附加到用 C++ 编写的托管代码,该代码必须发出 DebuggableAttribute。可通过链接 /ASSEMBLYDEBUG 链接器选项将它自动添加到代码中。

警告

若要附加到用 JavaScript 编写的 Windows 应用商店应用,你必须先为该应用启用调试。请参阅 Windows 开发人员中心中的Attach the debugger

有时,调试器能够成功附加到一种代码类型,但不能附加到另一种代码类型。 这种情况可能发生在你尝试附加到远程计算机上运行的进程时, 原因是远程计算机上可能安装了一些代码类型的远程调试组件,但没有安装另一些代码类型的远程调试组件。 这种情况还可能发生在你尝试为直接数据库调试附加到两个或多个进程时。 SQL 调试仅支持附加到单个进程。

如果调试器能够附加到某些代码类型而不是所有代码类型,你将看到一条消息,指示无法附加的类型。

如果调试器成功地附加到至少一种代码类型,你就可以继续调试进程。 你只能调试那些已被成功附加的代码类型。 上面的示例消息说明未能附加脚本代码类型。 因此,你将不能调试进程内的脚本代码。 进程内的脚本代码将继续运行,但无法设置断点、查看数据或在脚本中执行其他调试操作。

如果想了解有关调试器未能附加到某种代码类型的详细原因,可以尝试仅重新附加到该代码类型。

获得有关某种代码类型未能附加的详细原因

  1. 从进程中分离。 在**“调试”菜单上,单击“全部分离”**。

  2. 再次附加到进程,仅选择单一代码类型。

    1. 在**“附加到进程”对话框的“可用进程”**列表中选择进程。

    2. 单击**“选择”**。

    3. 在**“选择代码类型”对话框中,选择“调试以下代码类型”**和未能附加的代码类型。 清除任何其他代码。

    4. 单击“确定”。 **“选择代码类型”**对话框关闭。

    5. 在**“附加到进程”对话框中,单击“附加”**。

    此时,附加将彻底失败,并且你将收到一条特定的错误消息。

请参见

概念

在 Visual Studio 中调试一个或多个进程

在 Visual Studio 进行实时调试

其他资源

远程调试和诊断