可将 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. JVM的监控工具之jinfo

    参考博客:https://www.jianshu.com/p/8d8aef212b25 jinfo(ConfigurationInfoforJava)的作用是实时地查看和调整虚拟机各项参数,使用jps ...

  2. 拒绝CPU挖矿矿工有责

    长期以来CPU挖矿给挖矿行业带来持久的负面影响,因为CPU是电脑的核心设备,一挖矿就干不了别的了,大家是否可以达成共识拒绝CPU挖矿? 显卡挖矿刚好构建在不影响大众的日常工作生活对电脑的需求之上,家用 ...

  3. 你不知道的Go unsafe.Pointer uintptr原理和玩法

    unsafe.Pointer 这个类型比较重要,它是实现定位和读写的内存的基础,Go runtime大量使用它.官方文档对该类型有四个重要描述: (1)任何类型的指针都可以被转化为Pointer (2 ...

  4. laravel npm run dev 错误 npm run dev error [npm ERR! code ELIFECYCLE]

    出现此问题是node_modules出现错误,需要执行: 1 rm -rf node_modules 2 rm package-lock.json 3 npm cache clear --force ...

  5. mvc ajax跳转controller 的路径

    mvc Controller : url: "../phone/index",(控制器名,方法名) 一般处理程序.ashx :  url: "../bianji.ashx ...

  6. 关于前端ajax请求url为何添加一个随机数

    一.起因 我在做爬虫的时候发现很多网站上都在url上加一个随机数或者时间戳一开始我以为是啥加密后面发现其实他在后台解析的时候也不需要不排除有些网站他反爬就需要一个时间戳,那他加个随机数是做啥子 二.查 ...

  7. Qt程序app添加图标复制到其它电脑后不显示的解决方法

    原因: 主是要因为Qt显示图标需要依赖一些库来进行转换,而复制到其它电脑后不显示,是没有复制相应的库所致,所以把相应库复制过去就行了. 复制Qt的plugins目录下的imageformats文件到程 ...

  8. 入职一个月后 对.net的感想

    我本来应该找Java工程师的岗位的,因种种原因进入了.net开发工程师.然后,我进入了一扇新世界的大门. 1.语法不同,思想相同. 刚入职那几天,每天都好蒙,.net代码语法啥的都和Java不一样,a ...

  9. linux源代码获取

    Ubuntu获取 # which ls /bin/ls # dpkg -S /bin/ls coreutils: /bin/ls # apt-get source coreutils CentOS获取 ...

  10. 二、HDFS(架构、读写、NN)

    一.HDFS定义 HDFS (Hadooop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件:其次,它是分布式的,由很多服务器联合走来实现其功能 ...