天天看点

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

系列目录     【已更新最新开发文章,点击查看详细】

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

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

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

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

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

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

    Visual Studio 调试系列10 附加到正在运行的进程
  2. 在“可用进程”列表中,查找并选择要附加到的一个或多个进程。
    • 若要快速选择一个进程,请在“筛选进程”框中键入其名称或首字母。
    • 如果不知道进程名称,请浏览列表或参阅常见调试方案,了解一些常见的进程名称。

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

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

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

    若要手动选择代码类型:

    1. 单击“选择”。
    2. 在“选择代码类型”对话框中,选择“调试这些代码类型”。
    3. 选择你想要调试的代码类型。
    4. 选择 确定。
  4. 选择“附加”。
Visual Studio 调试系列10 附加到正在运行的进程
可附加到多个应用进行调试,但在调试器中一次只能有一个应用处于活动状态。 可在 Visual Studio 的“调试位置”工具栏或“进程”窗口中设置活动的应用。

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

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

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

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

  1. 在大多数情况下,“连接类型”应为“默认”。 在“连接目标”框中,使用以下方法之一选择远程计算机:
    • 选择下拉箭头旁边的“连接目标”,并从下拉列表中选择计算机名称。
    • 键入中的计算机名称连接目标框,然后按Enter。

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

      如果您不能使用远程计算机名称进行连接,请尝试使用 IP 和端口地址 (例如, 123.45.678.9:4022)。 4024 是 Visual Studio 2019 x64 远程调试器的默认端口。 有关其他远程调试器端口分配,请参阅远程调试器端口分配。
    • 选择查找按钮旁边连接目标框,以打开远程连接对话框。 远程连接对话框会列出本地子网上,或直接连接到您的计算机的所有设备。 你可能需要打开 UDP 端口 3702服务器以发现远程设备上。 选择的计算机或所需的设备,然后单击选择。
    “连接类型”设置在调试会话之间保持不变。 而“连接目标”设置只有在成功与该目标建立了调试连接时才会在调试会话之间保持不变。
  2. 单击“刷新”,填充“可用进程”列表。
    “附加到进程”对话框处于打开状态时,进程可以在后台启动和停止,因此正在运行的进程列表可能不总是最新内容。 可随时选择“刷新”查看当前列表。
    • 若要查找所有用户帐户下运行的进程,请选择“显示所有用户的进程”复选框。
      如果尝试附加到不受信任的用户帐户拥有的进程,则会出现安全警告对话框确认。 有关详细信息请参阅安全警告:附加到不受信任的用户所拥有的进程可能很危险。以下信息看上去可疑或者你不确定,如果未附加到此进程。

在某些情况下,在远程桌面(终端服务)会话中进行调试时,“可用进程”列表时不会显示所有可用进程。 如果以受限制的用户帐户的用户身份运行 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 排查附加错误

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

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

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

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

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

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

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

  1. 从进程中分离。 上调试菜单中,选择全部分离。
  2. 重新附加到进程,仅选择代码类型未能附加。
    1. 在“附加到进程”对话框,选择“可用进程”列表中的进程。
    2. 选择选择。
    3. 在 “选择代码类型” 对话框中,选择 “调试以下代码类型” 和未能附加的代码类型。取消选择其他代码类型。
    4. 在中附加到进程对话框中,选择附加。
    此时,附加将彻底失败,并且你将收到一条特定的错误消息。

其他信息请参考

  • 调试多个进程
  • 实时调试
  • 远程调试

成在管理,败在经验;嬴在选择,输在不学!  贵在坚持!

欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。

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

个人作品

1、BIMFace.Community.SDK.NET

     开源地址:https://gitee.com/NAlps/BIMFace.SDK

     系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html

     系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html

2、ZCN.NET.Common

     开源地址:https://gitee.com/NAlps/zcn.net.common

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

技术栈

 1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python

 2、jQuery、Vue.js、Bootstrap

 3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、达梦DM、人大金仓、 神通、南大通用 GBase、华为 GaussDB 、腾讯 TDSQL 、阿里 PolarDB、蚂蚁金服 OceanBase、东软 OpenBASE、浪潮云溪数据库 ZNBase

 4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表、读写分离

 5、架构:领域驱动设计 DDD、ABP

 6、环境:跨平台、Windows、Linux(CentOS、麒麟、统信UOS、深度Linux)、maxOS、IIS、Nginx、Apach

 7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler

 云原生、微服务、Docker、CI/CD、DevOps、K8S;

 Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件、RPC、ELK;

 .NET + Docker + jenkins + Github + Harbor + K8S;

出处:www.cnblogs.com/SavionZhang

作者:张传宁   微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。

          专注于微软.NET技术(.NET Core、Web、MVC、WinForm、WPF)、通用权限管理系统、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。

          多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。

          熟悉中小企业软件开发过程:需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如有问题,可以通过邮件[email protected]联系。共同交流、互相学习。

如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!