使用 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. 检查“连接类型”。

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

  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. 检查“连接类型”。

    在大多数方案中,可以使用“默认”。 某些方案(如调试 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,请从 WDK 和 WinDbg 下载中下载并安装适用于 Windows 的调试工具。

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

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

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

如果要发布到 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 工具包。

场景 调试方法 进程名 备注和链接
ASP.NET Core - IIS 服务器上的远程调试 使用远程工具和“附加到进程” w3wp.exe 或 dotnet.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.exe 或 msedge.exe 必须启用脚本调试。 对于 Chrome,还必须在调试模式下运行 Chrome(在命令行中键入 chrome.exe --remote-debugging-port=9222),并在“附加到”字段中选择“JavaScript 或 TypeScript”。
C#、Visual Basic 或 C++ 应用 - 在本地计算机上进行调试 使用标准调试 (F5) 或“附加到进程” <appname>.exe 在大多数情况下,请使用标准调试,而不是“附加到进程”。
Windows 桌面应用 - 远程调试 远程工具 不可用 请参阅远程调试 C# 或 Visual Basic 应用远程调试 C++ 应用
Linux 上的 .NET Core - 调试 使用“附加到进程” dotnet.exe 或唯一进程名称 若要使用 SSH,请参阅使用 SSH 远程调试正在 Linux 上运行的 .NET Core。 对于容器化应用,请参阅附加到在 Docker 容器上运行的进程
容器化应用 - 调试 使用“附加到进程” dotnet.exe 或唯一进程名称 请参阅附加到在 Docker 容器上运行的进程
Linux 上的 Python - 远程调试 使用“附加到进程” debugpy 请参阅从 Python 工具远程附加
其他受支持的应用类型 - 在服务器进程上进行调试 如果是远程服务器,请使用远程工具和“附加到进程” chrome.exe、msedge.exe 或其他进程 如有必要,请使用资源监视器来帮助识别进程。 请参阅远程调试
通用 Windows 平台 (UWP) 应用、OneCore、HoloLens 或 IoT 应用 - 远程调试 调试安装的应用包 不可用 请参阅调试安装的应用包,而不是使用“附加到进程”
UWP 应用、OneCore、HoloLens 或 IoT - 调试不是从 Visual Studio 启动的应用 调试安装的应用包 不可用 请参阅调试安装的应用包,而不是使用“附加到进程”

使用调试器功能

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

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

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

纠正附加错误

在某些情况下,调试程序可能需要帮助来正确识别要调试的代码的类型。 如果正确设置了连接值(可以在“可用进程”列表中查看正确的进程),但调试程序无法执行附加,请尝试在“代码类型”列表中选择最合适的调试程序(这样做可能是必需的,例如在调试 Linux 或 Python 应用时)。

在某些情况下,调试程序可能需要帮助来正确识别要调试的代码的类型。 如果正确设置了连接值(可以在“可用进程”列表中查看正确的进程),但调试程序无法执行附加,请尝试在“连接类型”列表中选择最合适的连接类型(这样做可能是必需的,例如在调试 Linux 或 Python 应用时)。 如果使用的是“默认”连接类型,也可以选择要连接到的特定类型代码,如此部分稍后所述。

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

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

  • 尝试附加到远程计算机上运行的进程。 原因是远程计算机上可能安装了一些代码类型的远程调试组件,但没有安装另一些代码类型的远程调试组件。
  • 尝试附加到两个或更多进程,以进行直接数据库调试。 SQL 调试仅支持附加到单个进程。

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

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

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

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

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

  2. 重新附加到该进程,但仅选择未能附加的代码类型。

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

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

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

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

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

  2. 重新附加到该进程,但仅选择未能附加的代码类型。

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

    2. 选择“选择” 。

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

    4. 选择“确定”。

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

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