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

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

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

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

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

    “连接类型”应设置为“默认”。 “连接目标”应该是本地计算机名称。

  2. 在“可用进程”列表中,查找并选择要附加到的一个或多个进程。

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

    • 如果不知道进程名称,请浏览列表或参阅常见调试方案,了解一些常见的进程名称。

    “附加到进程”对话框处于打开状态时,进程可以在后台启动和停止,因此正在运行的进程列表可能不总是最新内容。

    可随时选择“刷新”查看当前列表。

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

    若要手动选择代码类型:

    1. 单击“选择”。
    2. 在“选择代码类型”对话框中,选择“调试这些代码类型”。
    3. 选择你想要调试的代码类型。
    4. 选择 确定。
  4. 选择“附加”。

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

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

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

用于调试已部署到 IIS 的 ASP.NET 应用程序的更完整说明,请参阅远程调试远程 IIS 计算机上的 ASP.NET

若要将附加到远程计算机上正在运行的进程:

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

  2. 在大多数情况下,“连接类型”应为“默认”。 在“连接目标”框中,使用以下方法之一选择远程计算机:

    • 选择下拉箭头旁边的“连接目标”,并从下拉列表中选择计算机名称。

    • 键入中的计算机名称连接目标框,然后按Enter。

      验证 Visual Studio 将所需的端口添加到计算机名称,将出现在格式: <远程计算机名称 >: 端口

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

    • 选择查找按钮旁边连接目标框,以打开远程连接对话框。 远程连接对话框会列出本地子网上,或直接连接到您的计算机的所有设备。 你可能需要打开 UDP 端口 3702服务器以发现远程设备上。 选择的计算机或所需的设备,然后单击选择。

    “连接类型”设置在调试会话之间保持不变。 而“连接目标”设置只有在成功与该目标建立了调试连接时才会在调试会话之间保持不变。

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

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

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

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

    若要手动选择代码类型:

    1. 单击“选择”。
    2. 在“选择代码类型”对话框中,选择“调试这些代码类型”。
    3. 选择你想要调试的代码类型。
    4. 选择 确定。
  6. 选择“附加”。

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

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

03 重新附加到进程
您可以快速重新附加到先前已通过选择附加到的进程 “调试” > “重新附加到进程”(Shift+Alt+P)。 当选择此命令时,调试器会立即尝试附加到最后连接的进程,方法是首次尝试匹配先前的进程 ID ,如果失败,将匹配先前的进程名称。 如果不找到任何匹配项,或多个进程具有相同的名称,“附加到进程” 对话框将打开,这样您就可以选择正确的进程。

重新附加到进程命令是从 Visual Studio 2017 开始提供。

04 常见的调试方案

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

对于某些应用类型,如通用 Windows 应用 (UWP) ,不能直接附加到进程名称,而需使用 Visual Studio 中的“调试安装的应用程序包”菜单选项(请参阅表格)。

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

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

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

方案 调试方法 进程名 说明和链接
远程调试 ASP.NET 4 或 4.5 上 IIS 服务器 使用远程工具和附加到进程 w3wp.exe 请参阅远程调试远程 IIS 计算机上的 ASP.NET
IIS 服务器上的远程调试 ASP.NET Core 使用远程工具和附加到进程 dotnet.exe 有关应用程序部署,请参阅发布到 IIS。 有关调试,请参阅远程调试远程 IIS 计算机上的 ASP.NET Core
调试客户端脚本的本地 IIS 服务器上,为受支持的应用类型 使用附加到进程 chrome.exe, MicrosoftEdgeCP.exe,或iexplore.exe 必须启用脚本调试。对于 Chrome 中,也必须在调试模式下,选择运行 Chrome Webkit 代码中附加到字段。
调试C#,Visual Basic 或C++在本地计算机上的应用 使用任一标准调试 (F5) 或附加到进程 <appname>.exe 在大多数情况下,使用标准调试并不附加到进程。
远程调试 Windows 桌面应用程序 远程工具 不适用 请参阅远程调试C#或 Visual Basic 应用程序远程调试C++应用程序
调试 ASP.NET 应用程序在本地计算机上,在启动不带调试器的应用后 使用附加到进程 iiexpress.exe 这可能会有所帮助使应用程序加载速度更快,如 (例如) 进行分析时。
调试服务器进程上的其他受支持的应用类型 如果远程服务器,使用远程工具和附加到进程 chrome.exe, iexplore.exe,或其他进程 如有必要,使用资源监视器来帮助标识该进程。 请参阅远程调试
远程调试的通用 Windows 应用 (UWP)、 OneCore、 HoloLens 或 IoT 应用 调试安装的应用包 不适用 请参阅调试安装的应用包而不是使用附加到进程
调试未从 Visual Studio 启动的通用 Windows 应用 (UWP)、 OneCore、 HoloLens 或 IoT 应用 调试安装的应用包 不适用 请参阅调试安装的应用包而不是使用附加到进程
 
05 使用调试器的功能

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

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

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

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

有时,调试器可以成功连接到一种代码类型,但不能连接到另一种代码类型。如果您尝试连接到远程计算机上运行的进程,则可能会发生这种情况。远程计算机可能为某些代码类型安装了远程调试组件,但对其他代码类型则没有。如果您尝试连接到两个或多个进程以进行直接数据库调试,也会发生此问题。SQL调试仅支持附加到单个进程。

如果调试器能够附加到某些(但不是所有)代码类型,您会看到一条消息,标识哪些类型无法附加。

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

如果您需要有关调试器无法附加到代码类型的原因的更多具体信息,请尝试仅重新连接到该代码类型。

获得有关代码类型未能附加的具体信息:

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

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

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

    2. 选择选择。

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

    4. 选择 确定。

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

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

其他信息请参考

Visual Studio 调试系列10 附加到正在运行的进程的更多相关文章

  1. Visual Studio 调试 ---- 系列文章

    调试是软件开发过程中非常重要的一个部分,它具挑战性,但是也有一定的方法和技巧. Visual Studio 调试程序有助于你观察程序的运行时行为并发现问题. 该调试器可用于所有 Visual Stud ...

  2. Visual Studio 调试系列12 远程调试部署在远程计算机IIS上的ASP.NET应用程序

    系列目录     [已更新最新开发文章,点击查看详细] 要调试已部署到IIS的ASP.NET应用程序,请在部署应用程序的计算机上安装并运行远程工具,然后从Visual Studio附加到正在运行的应用 ...

  3. Visual Studio 调试系列6 监视变量(使用监视窗口和快速监视窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 当你进行调试时,可以使用 监视窗口 和 快速监视窗口 来监视变量和表达式. 仅在调试会话期间,这两个窗口才可用. 监视窗口可以在调试时一次显示多 ...

  4. Visual Studio 调试系列9 调试器提示和技巧

    系列目录     [已更新最新开发文章,点击查看详细] 01 固定数据提示 如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看. 即使在重新启动后,固定的变量也能 ...

  5. Visual Studio 调试系列2 基本调试方法

    系列目录     [已更新最新开发文章,点击查看详细] 在 Visual Studio 上下文中,当调试应用时,这通常意味着你在附加了调试器的情况下(即在调试器模式下)运行应用程序. 执行此操作时,调 ...

  6. Visual Studio 调试系列11 远程调试

    系列目录     [已更新最新开发文章,点击查看详细] 你可以调试已部署在另一台计算机的 Visual Studio 应用程序. 要进行此操作,可使用 Visual Studio 远程调试器. 01 ...

  7. Visual Studio 调试系列4 单步后退来检查旧应用状态(使用使用 IntelliTrace 窗口)

    系列目录     [已更新最新开发文章,点击查看详细] IntelliTrace 后退会在每个断点处及调试器步骤事件发生时自动拍摄应用程序的快照. 凭借记录的快照便可以返回到上一个断点或步骤,并查看当 ...

  8. Visual Studio调试的10个技巧

    本篇体验Visual Studio的10个调试技巧,包括: 1.插入断点和断点管理2.查看变量信息3.逐语句F11,逐过程F10,跳出Shift+F114.查看堆栈信息5.设置下一条执行语句6.调试时 ...

  9. Visual Studio 调试系列1 Debug 与 Release 模式

    系列目录     [已更新最新开发文章,点击查看详细] Debug 模式 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序. 在Debug模式下调试,可以在断点处看到 ...

随机推荐

  1. 【转】Visual Studio 2008 可扩展性开发(二):Macro和Add-In初探

    前言 在VS概览中,我们简单回顾了一下VS的历史.本文将通过两个简单的例子来说明Macro和Add-In的开发.通过Macro我们把VS中的一些重复操作录制下来,之后可以多次运行,节省时间并保持好的心 ...

  2. Spring Boot自定义配置实现IDE自动提示

    一.背景 官方提供的spring boot starter的配置项,我们用IDE配置的时候一般都有自动提示的,如下图所示 而我们自己自定义的配置却没有,对开发非常不友好容易打错配置,那这个是怎样实现的 ...

  3. 2018-9-30-win10-UWP-剪贴板-Clipboard

    原文:2018-9-30-win10-UWP-剪贴板-Clipboard title author date CreateTime categories win10 UWP 剪贴板 Clipboard ...

  4. SpringBoot结合策略模式实战套路

    1. SpringBoot结合策略模式实战套路 1.1. 前言 我们都知道设计模式好,可以让我们的代码更具可读性,扩展性,易于维护,但大部分程序猿一开始都学过至少一遍设计模式吧,实战中不知用到了几成. ...

  5. 为什么我推荐你用 Ubuntu 开发?

    微信.QQ.TIM.企业微信.钉钉等 1.首先需要安装 wine 环境,这里使用到开源的 deepin-wine-ubuntu (项目地址: https://github.com/wszqkzqk/d ...

  6. long类型在内存中占8个字节,float类型在内存中占4个字节,为什么long还要比float小呢?

    结论:数值范围大小和占用的字节没有关系. float类型的范围: 负数:-3.402823E38~-1.401298E-45 整数:0 正数:1.401298E-45~3.402823E38 long ...

  7. Docker容器服务(三)

    一.创建容器 容器是Docker的另一个核心概念. 简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层. 1.1创建一个容器 使用docker create命令创建的容器处于停止状 ...

  8. UE4 C++中出现的让人手足无措的问题(持续更新)

    最近开始涉入UE4更深层的一面——UE4 C++,由于其中的体系和在课本或者是网课上那么说的C++体系有一些误差(准确说就是遵循的C++标准不同),导致学习与运用起来有些吃力,所以作此总结,为自己的开 ...

  9. @RequestMapping和@GetMapping和PostMapping

    简介 - @GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写.该注解将HTTP Get 映射到 特定的处理方法上. - ...

  10. 前端学习笔记--CSS布局--层定位

    1.层定位概述: z-index:前后叠加顺序 2.position属性: 3.fixed: 2.relative: 移动后: static没有往上移动占据box1的位置. 3.absolute: 移 ...