Visual Studio 调试系列10 附加到正在运行的进程

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

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

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

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

  1. 在 Visual Studio 中,选择“调试” > “附加到进程”(或按 Ctrl+Alt+P),打开“附加到进程”对话框。 “连接类型”应设置为“默认”。 “连接目标”应该是本地计算机名称。
  1. 在“可用进程”列表中,查找并选择要附加到的一个或多个进程。
    • 若要快速选择一个进程,请在“筛选进程”框中键入其名称或首字母。
    • 如果不知道进程名称,请浏览列表或参阅常见调试方案,了解一些常见的进程名称。

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

  2. 在“附加到”字段中,确保已列出计划调试的代码类型。 默认的“自动”设置适用于大多数应用类型。 若要手动选择代码类型:
    1. 单击“选择”。
    2. 在“选择代码类型”对话框中,选择“调试这些代码类型”。
    3. 选择你想要调试的代码类型。
    4. 选择 确定。
  3. 选择“附加”。

可附加到多个应用进行调试,但在调试器中一次只能有一个应用处于活动状态。 可在 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. 在中附加到进程对话框中,选择附加。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Vincent-yuan

ASP.NET Core 框架本质学习

https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html

12020
来自专栏Core Net

ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)

上一章分享了如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新,本章继续进行下一步,用户授权。涉及到的例子也以上一章的为基础。(ASP....

14540
来自专栏网站建设、网站制作专栏

网站制作教程:PageAdmin建站系统在win2012上的安装

公司的网站是基于pageAdmin网站系统搭建的,最近服务器要升级,以前的服务器是win2008,新买的服务器是win2012,但是代码迁移过去后,iis配置好...

8920
来自专栏杰的记事本

Html.AntiForgeryToken 防止伪造提交

In this tutorial, I am not going to discuss the concept in-depth since they have...

11530
来自专栏雪雁的专栏

【A】兼容Core3.0后 Natasha 的隔离域与热编译操作。

深度克隆:https://github.com/night-moon-studio/DeepClone

8310
来自专栏DotNet程序园

ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)

上一章分享了如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新,本章继续进行下一步,用户授权。涉及到的例子也以上一章的为基础。(ASP....

11530
来自专栏杰的记事本

如何更改Json.NET的序列化规则

我想要使序列化出来的JSON都是小写,可以通过建立 LowercaseContractResolver:DefaultContractResolver

11220
来自专栏杰的记事本

ASP.NET的最新安全漏洞Important: ASP.NET Security Vulnerability

微软在9月17号中午正式对外公布了ASP.NET平台下的安全漏洞,即Microsoft Security Advisory (2416728)。

9410
来自专栏杰的记事本

用QUnit对Razor进行测试

Given how central JavaScript is to many modern web applications,  it is importan...

5740
来自专栏不止dotNET

.NET 程序员如何学习Vue

之所以取这个标题,是因为本文来自内部培训的整理,培训的对象是公司的 .NET 程序员,.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对...

13320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励