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

可以将 Visual Studio 调试器附加到本地或远程计算机上的正在运行的进程。 运行进程后,选择“ 调试>附加到进程 ”或在 Visual Studio 中按 Ctrl+Alt+p ,并使用“ 附加到进程 ”对话框将调试器附加到进程。

可以使用 “附加到进程 ”调试在本地或远程计算机上运行的应用、同时调试多个进程、调试未在 Visual Studio 中创建的应用,或者调试未从 Visual Studio 启动且附加调试器的任何应用。 例如,如果运行的应用没有调试器并遇到异常,则可以将调试器附加到运行应用的进程并开始调试。

小窍门

不确定是否对调试方案使用 “附加到进程 ”? 请参阅 常见调试方案

附加到本地计算机上的正在运行的进程

若要快速重新附加到之前附加到的进程,请参阅 “重新附加到进程”。

从 Visual Studio 2022 版本 17.10 预览版 2 开始,“附加到进程”对话框已更改。 如果需要与旧对话框匹配的说明,请切换到 Visual Studio 2019 视图(本文中的左上方版本选择器)。

若要附加到本地计算机上的进程,请执行以下操作:

  1. 在 Visual Studio 中,选择“ 调试>附加到进程 ”(或按 Ctrl+Alt+P)打开“ 附加到进程 ”对话框。

  2. 连接类型 设置为 “本地”。

    在大多数本地调试方案中,可以使用 “本地”。 某些方案可能需要不同的连接类型。 有关详细信息,请参阅本文中的其他部分或 常见调试方案

    “附加到进程”对话框的屏幕截图,其中连接目标设置为本地计算机名称。

  3. “可用进程 ”列表中,找到并选择要附加到的进程或进程。

    • 若要快速选择进程,请在 “筛选进程 ”框中键入其名称或首字母。
    • 如果不知道进程名称,请浏览列表,或查看一些常见进程名称的常见 调试方案
    • 使用“选择窗口”按钮,在计算机上启用窗口选择功能,从而设置该过程。

    小窍门

    进程可以在打开“ 附加到进程 ”对话框时在后台启动和停止,因此正在运行的进程列表可能并不总是最新的。 可以随时选择“ 刷新 ”以查看当前列表。

  4. “代码类型 ”字段中,确保列出了计划调试的代码类型。

    默认 的自动 设置适用于大多数应用类型,但你可以选择特定的代码类型来手动指定调试器类型。

  5. 选择 附加

小窍门

在有多个相同的进程的情况下,请使用“标题”列中的命令行列或 w3wp 进程详细信息来标识正确的进程。

  1. 在 Visual Studio 中,选择“ 调试>附加到进程 ”(或按 Ctrl+Alt+P)打开“ 附加到进程 ”对话框。

  2. 检查 连接类型

    在大多数情况下,可以使用 Default。 某些方案可能需要不同的连接类型。 有关详细信息,请参阅本文中的其他部分或 常见调试方案

  3. 连接目标 设置为本地计算机名称。

    “附加到进程”对话框的屏幕截图,其中连接目标设置为本地计算机名称。

  4. “可用进程 ”列表中,找到并选择要附加到的进程或进程。

    • 若要快速选择进程,请在 “筛选进程 ”框中键入其名称或首字母。

    • 如果不知道进程名称,请浏览列表,或查看一些常见进程名称的常见 调试方案

    小窍门

    进程可以在打开“ 附加到进程 ”对话框时在后台启动和停止,因此正在运行的进程列表可能并不总是最新的。 可以随时选择“ 刷新 ”以查看当前列表。

  5. “附加到” 字段中,确保列出了计划调试的代码类型。 默认 的“自动 ”设置适用于大多数应用类型。

    如果使用 默认 连接类型,可以手动选择要附加到的代码类型。 否则,可能会禁用 “选择” 选项。

    手动选择代码类型:

    1. 单击“选择”。
    2. 在“ 选择代码类型 ”对话框中,选择 “调试这些代码类型”。 如果在尝试附加到列表中的进程时遇到失败,可以使用 “选择代码类型 ”对话框帮助 排查 该问题。
    3. 选择要调试的代码类型。
    4. 选择“确定”
  6. 选择 附加

注释

可以附加到多个应用进行调试,但一次只有一个应用在调试器中处于活动状态。 可以在 Visual Studio “调试位置” 工具栏或 “进程 ”窗口中设置活动应用。

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

还可以在“ 附加到进程 ”对话框中选择远程计算机,查看在该计算机上运行的可用进程列表,并附加到一个或多个进程进行调试。 远程调试器(msvsmon.exe)必须在远程计算机上运行。 有关详细信息,请参阅 远程调试

从 Visual Studio 2022 版本 17.10 预览版 2 开始,“附加到进程”对话框已更改。 如果需要与旧对话框匹配的说明,请切换到 Visual Studio 2019 视图(本文中的左上方版本选择器)。

若要在远程计算机上附加到正在运行的进程,请执行以下操作:

  1. 在 Visual Studio 中,选择“ 调试>附加到进程 ”(或按 Ctrl+Alt+P)打开“ 附加到进程 ”对话框。

  2. 连接类型设置为远程连接类型,例如远程连接类型(Windows)。

    在大多数情况下,在 Windows 上进行远程调试时,可以使用远程 (Windows)。 某些方案(例如调试 Linux 或容器化应用)需要不同的连接类型。 有关详细信息,请参阅本文中的其他部分或 常见调试方案

    此时会显示 “连接目标 ”选项。

  3. “连接目标 ”框中,使用以下方法之一选择远程计算机:

    • 选择 连接目标旁边的下拉列表箭头,然后从下拉列表中选择计算机名称。
    • “连接目标 ”框中键入计算机名称,然后按 Enter
    • 选择“连接目标”框旁边的“查找”按钮以打开“远程连接”对话框。 “ 远程连接 ”对话框列出本地子网上或直接附加到计算机的所有设备。 可能需要 在服务器上打开出站 UDP 端口 3702 才能发现远程设备。 选择所需的计算机或设备,然后关闭对话框。

    验证 Visual Studio 是否将所需的端口添加到计算机名称,格式如下:<远程计算机名称>:端口

    注释

    如果无法使用远程计算机名称进行连接,请尝试使用 IP 和端口地址(例如, 123.45.678.9:4026)。 4026 是 Visual Studio 2022 远程调试器的默认端口。 有关其他远程调试器端口分配,请参阅 远程调试器端口分配

    连接类型设置在调试会话之间保留。 仅当成功与该目标的调试连接发生时, 连接目标 设置才会在调试会话之间保留。

  4. 单击“ 刷新 ”以填充 “可用进程 ”列表。

    小窍门

    进程可以在打开“ 附加到进程 ”对话框时在后台启动和停止,因此正在运行的进程列表可能并不总是最新的。 可以随时选择“ 刷新 ”以查看当前列表。

  5. “可用进程 ”列表中,找到并选择要附加到的进程或进程。

  6. “代码类型 ”字段中,确保列出了计划调试的代码类型。

    默认 的自动 设置适用于大多数应用类型,但你可以选择特定的代码类型来手动指定调试器类型。

  7. 选择 附加

  1. 在 Visual Studio 中,选择“ 调试>附加到进程 ”(或按 Ctrl+Alt+P)打开“ 附加到进程 ”对话框。

  2. 检查 连接类型

    在大多数情况下,可以使用 Default。 某些方案(例如调试 Linux 或容器化应用)需要不同的连接类型。 有关详细信息,请参阅本文中的其他部分或 常见调试方案

  3. “连接目标 ”框中,使用以下方法之一选择远程计算机:

    • 选择 连接目标旁边的下拉列表箭头,然后从下拉列表中选择计算机名称。
    • “连接目标 ”框中键入计算机名称,然后按 Enter
    • 选择“连接目标”框旁边的“查找”按钮以打开“远程连接”对话框。 “ 远程连接 ”对话框列出本地子网上或直接附加到计算机的所有设备。 可能需要 在服务器上打开出站 UDP 端口 3702 才能发现远程设备。 选择所需的计算机或设备,然后选择“ 选择”。

    验证 Visual Studio 是否将所需的端口添加到计算机名称,格式如下:<远程计算机名称>:端口

    注释

    如果无法使用远程计算机名称进行连接,请尝试使用 IP 和端口地址(例如, 123.45.678.9:4022)。 4024 是 Visual Studio 2019 远程调试器的默认端口。 有关其他远程调试器端口分配,请参阅 远程调试器端口分配

    连接类型设置在调试会话之间保留。 仅当成功与该目标的调试连接发生时, 连接目标 设置才会在调试会话之间保留。

  4. 单击“ 刷新 ”以填充 “可用进程 ”列表。

    小窍门

    进程可以在打开“ 附加到进程 ”对话框时在后台启动和停止,因此正在运行的进程列表可能并不总是最新的。 可以随时选择“ 刷新 ”以查看当前列表。

  5. “可用进程 ”列表中,找到并选择要附加到的进程或进程。

  6. “附加到” 字段中,确保列出了计划调试的代码类型。 默认 的“自动 ”设置适用于大多数应用类型。

    如果使用 默认 连接类型,可以手动选择要附加到的代码类型。 否则,可能会禁用 “选择” 选项。

    手动选择代码类型:

    1. 单击“选择”。
    2. 在“ 选择代码类型 ”对话框中,选择 “调试这些代码类型”。 如果在尝试附加到列表中的进程时遇到失败,可以使用 “选择代码类型 ”对话框帮助 排查 该问题。
    3. 选择“确定”
  7. 选择 附加

注释

可以附加到多个应用进行调试,但一次只有一个应用在调试器中处于活动状态。 可以在 Visual Studio “调试位置” 工具栏或 “进程 ”窗口中设置活动应用。

在某些情况下,在远程桌面(终端服务)会话中调试时, “可用进程 ”列表不会显示所有可用的进程。 如果您以受限用户帐户用户的身份运行 Visual Studio,则 “可用进程”列表 不会显示在会话 0 中运行的进程。 会话 0 用于服务和其他服务器进程,包括 w3wp.exe。 可以通过在管理员帐户下运行 Visual Studio 或通过服务器控制台而不是远程桌面会话运行 Visual Studio 来解决该问题。

如果这两种解决方法都不可能,第三个选项是通过从 Windows 命令行运行 vsjitdebugger.exe -p <ProcessId> 来附加到进程。 可以使用 tlist.exe确定进程 ID。 若要获取 tlist.exe,请下载并安装适用于 Windows 的调试工具,可在 WDK 和 WinDbg 下载中使用。

附加到在 Azure 应用服务上运行的 .NET Core 进程(Windows)

如果要发布到 Azure 应用服务(Windows),请参阅 Azure 上的远程调试 ASP.NET Core调试 Azure 应用服务 以获取说明。

附加到在 Azure 应用服务上运行的 .NET Core 进程(Windows)

如果要发布到 Azure 应用服务(Windows),则会在发布配置文件中的“托管”菜单下找到“附加调试器”选项。 Visual Studio 尝试将远程调试器附加到配置文件所发布的 Azure 应用服务(Windows)实例。

“发布摘要”页中“附加调试器”选项的屏幕截图。

使用 SSH 连接到运行在 Linux 上的 .NET Core 进程

有关详细信息,请参阅 使用 SSH 在 Linux 上运行的远程调试 .NET Core

连接到 Docker 容器中运行的进程

从 Visual Studio 2019 开始,可以将 Visual Studio 调试器附加到 Docker 容器上运行的进程。 有关 Linux .NET Core Docker 容器,请参阅 附加到在 Linux Docker 容器上运行的进程。 有关 Windows Docker 容器,请参阅 附加到在 Windows Docker 容器上运行的进程

重新附加到进程

您可以通过选择 “调试>重新附加到进程”(Shift+Alt+P),快速重新连接到之前连接的进程。 选择此命令时,调试器将立即尝试附加到上次连接的进程。它首先会尝试匹配之前的进程 ID,如果失败,将尝试根据之前的进程名称进行匹配。 如果未找到匹配项,或者如果多个进程具有相同的名称,则会打开 “附加到进程 ”对话框,以便你可以选择正确的进程。

注释

从 Visual Studio 2017 开始,“ 重新附加到进程 ”命令可用。

常见调试方案

为了帮助你确定是否使用 “附加到进程 ”以及要附加到哪个进程,下表显示了一些常见的调试方案,并提供了指向更多可用说明的链接。 (列表并不详尽。

若要快速选择要附加到的正在运行的进程,请在 Visual Studio 中键入 Ctrl+Alt+P,然后键入进程名称的第一个字母。

为了让调试器连接到用C++编写的代码,代码需要发出DebuggableAttribute。 可以通过链接到 /ASSEMBLYDEBUG 链接器选项,可自动将其添加到代码中。

对于客户端脚本调试,必须在浏览器中启用脚本调试。 若要在 Chrome 上调试客户端脚本,请选择 JavaScript 或 TypeScript 作为代码类型,并且根据应用类型,可能需要关闭所有 Chrome 实例并在调试模式下启动浏览器(从命令行键入 chrome.exe --remote-debugging-port=9222 )。

对于客户端脚本调试,必须在浏览器中启用脚本调试。 若要在 Chrome 上调试客户端脚本,请选择 JavaScript(Chrome)JavaScript(Microsoft Edge - Chromium) 作为代码类型,并且根据应用类型,可能需要关闭所有 Chrome 实例并在调试模式下启动浏览器(从命令行键入 chrome.exe --remote-debugging-port=9222 )。 在早期版本的 Visual Studio 中,适用于 Chrome 的脚本调试器是 Web 工具包

Scenario 调试方法 进程名 备注和链接
ASP.NET 核心 - Internet Information Services (IIS) 服务器上的远程调试 使用远程工具和 附加到进程 w3wp.exedotnet.exe 从 .NET Core 3 开始, w3wp.exe 进程用于默认 应用内托管模型。 有关应用部署,请参阅 “发布到 IIS”。 有关详细信息,请参阅 远程 IIS 计算机上的远程调试 ASP.NET Core
ASP.NET Core - 在不使用调试器的情况下启动应用后在本地计算机上调试 使用 附加到进程 appname.exeiisexpress.exe 这可能有助于加快应用加载速度,例如(例如)分析时。 ASP.NET Core 的默认本地服务器 (kestrel) 进程 appname.exe
ASP.NET 4 或 4.5 - 在 IIS 服务器上远程调试 使用远程工具和 附加到进程 w3wp.exe 请参阅 远程 IIS 计算机上的远程调试 ASP.NET
客户端脚本 - 在本地 IIS 服务器上调试,适用于受支持的应用类型 使用 附加到进程 chrome.exemsedge.exe 必须启用脚本调试。 对于 Chrome,还必须在调试模式下运行 Chrome(从命令行键入chrome.exe --remote-debugging-port=9222),然后在“附加到”字段中选择 JavaScript 或 TypeScript
C#、Visual Basic 或 C++ 应用 - 在本地计算机上调试 使用标准调试(F5)或 附加到进程 {appname}.exe 在大多数情况下,请使用标准调试,而不是 附加到进程
Windows 桌面应用 - 远程调试 远程工具 N/A 请参阅 远程调试 C# 或 Visual Basic 应用 ,或 远程调试C++应用
Linux 上的 .NET Core - 调试 使用 附加到进程 dotnet.exe 或唯一的进程名称 若要使用 SSH,请参阅 使用 SSH 在 Linux 上运行的远程调试 .NET Core。 有关容器化应用,请参阅 附加到 Docker 容器中运行的进程
容器化应用 - 调试 使用 附加到进程 dotnet.exe 或唯一的进程名称 请参阅 附加到 Docker 容器中运行的进程
Linux 上的 Python - 远程调试 使用 连接到进程 debugpy 请参阅 使用 Python 工具进行远程附加
其他受支持的应用类型 - 在服务器进程中调试 如果服务器是远程服务器,请使用远程工具并 附加到进程 chrome.exemsedge.exe或其他进程 如有必要,请使用资源监视器来帮助识别该过程。 请参阅 远程调试
通用 Windows 平台(UWP)应用、OneCore、HoloLens 或 IoT 应用 - 远程调试 调试已安装的应用包 N/A 请参阅 调试已安装的应用包 ,而不是使用 “附加到进程”
UWP 应用、OneCore、HoloLens 或 IoT - 调试未从 Visual Studio 启动的应用 调试已安装的应用包 N/A 请参阅 调试已安装的应用包 ,而不是使用 “附加到进程”

使用调试器功能

若要在附加到进程时使用 Visual Studio 调试器的全部功能(例如命中断点),应用程序必须与本地源代码和符号完全相符。 也就是说,调试器必须能够加载正确的 符号 (.pdb) 文件。 默认情况下,这需要调试版本。

对于远程调试方案,必须在 Visual Studio 中打开源代码(或源代码的副本)。 远程计算机上的已编译应用程序二进制文件必须来自与本地计算机相同的构建。

在某些本地调试方案中,如果应用存在正确的符号文件,则可以在 Visual Studio 中调试,且无法访问源。 默认情况下,这需要调试版本。 有关详细信息,请参阅 指定符号和源文件

排查附件错误

在某些情况下,调试器可能需要帮助才能正确识别要调试的代码类型。 如果连接值设置正确(可以在 可用进程 列表中查看正确的进程),但调试器无法附加,请尝试在 代码类型 列表中选择最合适的调试器,例如,如果要调试 Linux 或 Python 应用,则可能需要它。

在某些情况下,调试器可能需要帮助才能正确识别要调试的代码类型。 如果连接值设置正确(可以在 “可用进程 ”列表中查看正确的进程),但调试器无法附加,请尝试在 “连接类型 ”列表中选择最合适的连接类型,例如,如果要调试 Linux 或 Python 应用,则可能需要该类型。 如果使用默认连接类型,则可以选择要连接到的特定类型的代码,如本节稍后所述。

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

有时,调试器可以成功附加到一种代码类型,但不能附加到另一个代码类型。 通常,在以下情况下会发生此情况:

  • 您尝试附加到远程计算机上运行的进程。 远程计算机可能为某些代码类型安装了远程调试组件,但不适用于其他代码类型。
  • 尝试附加到两个或多个进程以直接进行数据库调试。 SQL 调试仅支持附加到单个进程。

如果调试器能够附加到部分代码类型(但不是全部),则会看到一条消息来标识未能附加的类型。

如果调试器成功附加到至少一个代码类型,则可以继续调试该过程。 只能调试已成功附加的代码类型。 进程中未附加的代码仍将运行,但无法设置断点、查看数据或对该代码执行其他调试作。

如果想要更具体的信息,说明调试器为何无法附加到代码类型,请尝试仅重新附加到该代码类型。

获取有关代码类型无法附加的原因的特定信息

  1. 从进程分离。 在“调试”菜单上,选择“全部分离”

  2. 重新附加到进程时,仅选择导致附加失败的代码类型。

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

    2. “代码类型 ”选项中,选择未能附加的代码类型。 取消勾选其他代码类型。

    3. 在“ 附加到进程 ”对话框中,选择“ 附加”。

    这一次,连接将完全失败。你将收到具体的错误消息。

  1. 从进程中分离。 在调试菜单上,选择分离所有

  2. 重新附加到进程,仅选择附加失败的代码类型。

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

    2. 选择 选择

    3. 在“ 选择代码类型 ”对话框中,选择“ 调试这些代码类型 ”和未能附加的代码类型。 取消选择其他代码类型。

    4. 选择“确定”

    5. 在“ 附加到进程 ”对话框中,选择“ 附加”。

    这一次,附加将完全失败,你将收到特定的错误消息。