在 Visual Studio 中调试 Azure 云服务

Visual Studio 提供了不同的选项来调试 Azure 云服务和虚拟机。

先决条件

在本地计算机上调试云服务

使用 Azure 计算模拟器在本地计算机上调试云服务可以节省时间和金钱。 部署某个服务之前在本地对其进行调试可以提高可靠性和性能,且不会产生计算时间的相关费用。 但是,仅在 Azure 自身中运行云服务时,某些错误才可能会出现。 如果在发布服务时启用远程调试,然后将调试器附加到角色实例,则可以调试这些错误。

该模拟器模拟 Azure 计算服务并在本地环境中运行,使你可以在部署云服务之前对其进行测试和调试。 该模拟器将处理角色实例的生命周期,并提供对所模拟资源(如本地存储)的访问。 从 Visual Studio 调试或运行服务时,Visual Studio 会自动将模拟器作为后台应用程序启动,然后将服务部署到模拟器。 当模拟器在本地环境中运行时,可以使用它来查看服务。 可以运行完整版或速成版的模拟器。 请参阅使用 Emulator Express 在本地运行和调试云服务

在本地计算机上调试云服务

  1. 在菜单栏上,选择调试>开始调试,以运行 Azure 云服务项目。 或者,可以按 F5。 你会看到一条消息,指明计算模拟器正在启动。 当该模拟器启动时,系统托盘图标会对其进行确认。

    系统托盘中的 Azure 模拟器

  2. 打开通知区域中的 Azure 图标快捷菜单,并选择“显示计算模拟器 UI”,从而显示计算模拟器的用户界面。

    UI 的左窗格显示了当前部署到计算模拟器的服务以及每项服务正在运行的角色实例。 可选择服务或角色,以便在右窗格中显示生命周期、日志记录和诊断信息。 如果将焦点置于包括窗口的上边距中,则该窗口将展开以填写右侧窗格。

  3. 通过选择调试菜单上的命令并设置代码中的断点来单步执行应用程序。 在调试器中单步执行应用程序时,窗格会随着应用程序的当前状态而更新。 当停止调试时,将删除应用程序部署。 如果应用程序包含 Web 角色,并且已将启动操作属性设置为启动 Web 浏览器,Visual Studio 会在浏览器中启动 Web 应用程序。 如果更改服务配置中某个角色的实例数,则必须停止云服务,然后重新启动调试,以便可以调试该角色的这些新实例。

    注意

    停止运行或调试服务时,不会停止本地计算模拟器和存储模拟器。 必须从通知区域显式将其停止。

在 Azure 中调试云服务

调试过程取决于使用的是云服务(外延支持)还是云服务经典模型。 有关云服务(外延支持)的信息,请继续阅读。 有关经典模型的信息,请参阅调试 Azure 云服务(经典模型)

如果使用本节介绍的过程为云服务启用远程调试,则不会导致性能下降或费用增加。 请勿在生产服务上使用远程调试,因为使用该服务的客户端可能会受到不利影响。

注意

从 Visual Studio 中发布云服务时,可以为该服务中所有以 .NET Framework 4 或 .NET Framework 4.x 为目标的角色启用 IntelliTrace。 使用 IntelliTrace 可以检查过去发生在某个角色实例中的事件,并重现当时的上下文。 请参阅使用 IntelliTrace 和 Visual Studio 调试已发布的云服务使用 IntelliTrace 进行调试

为云服务(外延支持)启用远程调试

  1. 将终结点添加到默认 msvsmon 端口的 ServiceDefinition.csdef。 对于 Visual Studio 2019,则添加到端口 4024。

    <Endpoints>
       <InputEndpoint name="RemoteDebug" protocol="tcp" port="4024" localPort="4024" />
    </Endpoints>
    

    注意

    其他版本的 Visual Studio 具有不同的端口,请参阅远程调试器端口分配

  2. 打开 Azure 项目的快捷菜单,并选择“发布”。

  3. 选择“过渡”环境和“调试”配置。

    这些内容仅供指导。 可以选择在生产环境中运行测试环境。 但是,如果在生产环境中启用远程调试,则可能会对用户造成不利影响。 可以选择“发布”配置,但是,“调试”配置能使调试变得更轻松。

    选择调试配置。

  4. 按照云服务(外延支持)中所述的常规步骤操作,但选中为所有角色启用远程桌面复选框。

    系统将要求你为远程桌面用户创建用户名和密码,稍后登录到该虚拟机时需要用到这些信息。

  5. 转到下一个屏幕,查看设置,准备就绪后,单击发布并等待部署完成。

  6. 登录到 Azure 门户并导航到要调试的云服务(外延支持)。

  7. 在左侧窗格中选择角色和实例,然后选择要进行远程调试的角色。

  8. 单击右侧角色实例弹出窗口中的连接,然后选择连接按钮下载一个远程桌面文件,该文件可让你登录到虚拟机。 使用在上一步中启用远程桌面时创建的凭据登录。

    显示具有“连接”选项的角色实例弹出窗口的屏幕截图。

  9. 在远程 Azure 虚拟机上,按照远程调试中所述安装 Visual Studio 2019 远程工具。

  10. 在虚拟机上的桌面上,执行命令 D:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Remote Debugger\x64\msvsmon.exe。 确保以管理员身份运行。

  11. 接受提示以允许通过防火墙进行访问。 你应会看到一条消息,指示 msvsmon.exe 已开始侦听连接。

  12. 在 Azure 门户中,打开资源组,获取云服务(外延支持)的公共 IP 地址。

    显示可供查找云服务的公共 IP 地址的位置的屏幕截图。

将调试器附加到 Azure 云服务(外延支持)

注意

应尽可能使用发布过程中选择的调试配置进行调试,但如果要调试发布配置,则在 Visual Studio 中,使用 Ctrl+Q 搜索“仅我的代码”,并取消选中工具>选项>调试器>常规中的启用仅我的代码。 发布版本已优化,因此不被视为“我的代码”。

  1. 依次选择调试>附加到进程(或按 Ctrl+Alt+P)。

  2. 将连接类型保留为默认

  3. 使用 IP 地址和端口 {ipaddress}:4024 输入连接目标。

  4. 附加到设置为自动

  5. 使用与远程桌面用户相同的凭据登录。

  6. 选择显示所有用户的进程。 如果要调试辅助角色,请附加到 WaWorkerHost.exe;如果要调试 Web 角色,请附加到 w3wp.exe 进程;对于 Web API 角色,请附加到 WaIISHost.exe

  7. 设置断点(导航到行,然后按 F9),访问站点的公共 URL,并重现要调试的场景。

为云服务(外延支持)启用远程调试

  1. 将终结点添加到默认 msvsmon 端口的 ServiceDefinition.csdef。 对于 Visual Studio 2022,请添加到端口 4026;对于 Visual Studio 2019,则添加到端口 4024。

    <Endpoints>
       <InputEndpoint name="RemoteDebug" protocol="tcp" port="4026" localPort="4026" />
    </Endpoints>
    

    注意

    其他版本的 Visual Studio 具有不同的端口,请参阅远程调试器端口分配

  2. 如果以 .NET 4.8 为目标,请确保在发布云服务(扩展支持)时打开 ServiceConfiguration.Cloud.cscfg 文件并检查 ServiceConfiguration 元素上的 osFamily 属性值。 对于 .NET 4.8 项目,请使用 osFamily="7"

  3. 打开 Azure 项目的快捷菜单,并选择“发布”。

  4. 选择“过渡”环境和“调试”配置。

    这些内容仅供指导。 可以选择在生产环境中运行测试环境。 但是,如果在生产环境中启用远程调试,则可能会对用户造成不利影响。 可以选择“发布”配置,但是,“调试”配置能使调试变得更轻松。

    选择调试配置

  5. 按照云服务(外延支持)中所述的常规步骤操作,但选中为所有角色启用远程桌面复选框。

    系统将要求你为远程桌面用户创建用户名和密码,稍后登录到该虚拟机时需要用到这些信息。

  6. 转到下一个屏幕,查看设置,准备就绪后,单击发布并等待部署完成。

  7. 登录到 Azure 门户并导航到要调试的云服务(外延支持)。

  8. 在左侧窗格中选择角色和实例,然后选择要进行远程调试的角色。

  9. 单击右侧角色实例弹出窗口中的连接,然后选择连接按钮下载一个远程桌面文件,该文件可让你登录到虚拟机。 使用在上一步中启用远程桌面时创建的凭据登录。

    显示具有“连接”选项的角色实例弹出窗口的屏幕截图。

  10. 在远程 Azure 虚拟机上,按照远程调试中所述安装 Visual Studio 2022 远程工具。

  11. 在虚拟机上的桌面上,执行命令 D:\Program Files\Microsoft Visual Studio 17.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe。 确保以管理员身份运行。

  12. 接受提示以允许通过防火墙进行访问。 你应会看到一条消息,指示 msvsmon.exe 已开始侦听连接。

    显示 msvsmon.exe 正在侦听连接的屏幕截图。

  13. 在 Azure 门户中,打开资源组,获取云服务(外延支持)的公共 IP 地址。

    显示可供查找云服务的公共 IP 地址的位置的屏幕截图。

将调试器附加到 Azure 云服务(外延支持)

注意

应尽可能使用发布过程中选择的调试配置进行调试,但如果要调试发布配置,则在 Visual Studio 中,使用 Ctrl+Q 搜索“仅我的代码”,并取消选中工具>选项>调试器>常规中的启用仅我的代码。 发布版本已优化,因此不被视为“我的代码”。

  1. 依次选择调试>附加到进程(或按 Ctrl+Alt+P)。

  2. 将连接类型保留为默认

  3. 使用 IP 地址和端口 {ipaddress}:4026 输入连接目标。

  4. 附加到设置为自动

  5. 使用与远程桌面用户相同的凭据登录。

  6. 选择显示所有用户的进程。 如果要调试辅助角色,请附加到 WaWorkerHost.exe;如果要调试 Web 角色,请附加到 w3wp.exe 进程;对于 Web API 角色,请附加到 WaIISHost.exe

  7. 设置断点(导航到行,然后按 F9),访问站点的公共 URL,并重现要调试的场景。

调试 Azure 云服务(经典模型)

若要从远程计算机调试云服务,必须在部署云服务时显式启用该功能,以便在运行角色实例的虚拟机上安装所需的服务(例如 msvsmon.exe)。 如果在发布服务时未启用远程调试,则必须在启用远程调试的情况下重新发布该服务。

为云服务启用远程调试不会导致性能下降或费用增加。 请勿在生产服务上使用远程调试,因为使用该服务的客户端可能会受到不利影响。

注意

当从 Visual Studio 中发布云服务时,可以为该服务中所有以 .NET Framework 4 或 .NET Framework 4.5 为目标的角色启用 IntelliTrace。 使用 IntelliTrace 可以检查过去发生在某个角色实例中的事件,并重现当时的上下文。 请参阅使用 IntelliTrace 和 Visual Studio 调试已发布的云服务使用 IntelliTrace 进行调试

为云服务(经典模型)启用远程调试

  1. 打开 Azure 项目的快捷菜单,并选择“发布”。

  2. 选择“过渡”环境和“调试”配置。

    这些内容仅供指导。 可以选择在生产环境中运行测试环境。 但是,如果在生产环境中启用远程调试,则可能会对用户造成不利影响。 可以选择“发布”配置,但是,“调试”配置能使调试变得更轻松。

    选择调试配置

  3. 请按照常规步骤进行操作,但在高级设置选项卡上选中为所有角色启用远程调试器复选框。

    调试配置

将调试器附加到 Azure 云服务(经典模型)

  1. 在“服务器资源管理器”中,展开云服务的节点。

  2. 打开要附加的角色或角色实例的快捷菜单,并选择“附加调试器”。

    如果要调试某个角色,Visual Studio 调试器将附加到该角色的每个实例中。 对于运行某个断点所在的代码行并符合该断点的所有条件的第一个角色实例,调试器会在该断点位置中断。 如果调试某个实例,调试器将只附加到该实例,并且仅当该特定实例运行某个断点所在的代码行并符合该断点的条件时,调试器才在该断点位置中断。

    附加调试器

  3. 将调试器附加到实例后,像往常一样进行调试。 调试器会自动附加到角色的相应主机进程。 根据具体的角色,调试器将附加到 w3wp.exe、WaWorkerHost.exe 或 WaIISHost.exe。 若要确认调试器附加到的进程,请展开“服务器资源管理器”中的实例节点。 有关 Azure 进程的详细信息,请参阅 Azure 角色体系结构

    选择代码类型对话框

  4. 若要识别调试器附加到的进程,请在菜单栏中选择“调试”>“Windows”>“进程”,然后打开“进程”对话框。 (键盘操作:Ctrl+Alt+Z)要分离特定的进程,请打开其快捷菜单,然后选择“分离进程”。 或者,在“服务器资源管理器”中找到实例节点,找到该进程,打开其快捷菜单,并选择“分离进程”。

    调试进程

警告

远程调试时避免长时间停止在断点处。 Azure 会将停止时间超过数分钟的进程视为无响应,并停止向相应的实例发送流量。 如果停止时间太长,msvsmon.exe 将与进程分离。

要将调试器与实例或角色中的所有进程分离,请打开要调试的角色或实例的快捷菜单,然后选择“分离调试器”。

在 Azure 中进行远程调试的限制

远程调试存在以下限制:

  • 启用远程调试后,无法发布其中的任一角色包含 25 个以上实例的云服务。

  • 调试器使用端口 30400 至 30424、端口 31400 至 31424 以及端口 32400 至 32424。 如果尝试使用其中的任一端口,将无法发布服务,并且 Azure 的活动日志中会显示以下错误消息之一:

    • 根据 .csdef 文件验证 .cscfg 文件时出错。 角色“role”的终结点 Microsoft.WindowsAzure.plug-ins.RemoteDebugger.Connector 的保留端口范围“range”与已定义的端口或范围重叠。
    • 分配失败。 请稍后重试,尝试减少 VM 大小或角色实例数目,或者尝试部署到其他区域。

调试 Azure 应用服务

可以使用 Visual Studio 中的“附加到进程”对话框调试 Azure 应用服务中运行的程序。

注意

这仅适用于从 Visual Studio 2022 17.1 开始的 Windows Azure 应用服务。

调试 Windows Azure 应用服务

  1. 调试下,选择附加到进程

  2. 连接类型更改为 Microsoft Azure 应用服务,然后选择查找...

  3. 在打开的对话框中,选择“订阅名称”。

    “选择 Azure 应用服务”对话框的屏幕截图,其中显示了要选择的应用服务列表。

    注意

    需要登录到 Microsoft 帐户,才能访问包含 Azure 应用服务的订阅。

  4. 按资源组或资源类型筛选视图,或按名称搜索。

  5. 接下来,选择要调试的应用服务,然后选择确定

    这将在应用服务上启用远程调试,并显示要附加到的可用进程列表。

    “附加到进程”窗口的屏幕截图,其中显示了在所选应用服务上运行的进程。

  6. 选择要附加到的进程,然后选择“附加”以开始调试。

调试 Azure 虚拟机

可以在 Visual Studio 中使用服务器资源管理器调试 Azure 虚拟机上运行的程序。 在 Azure 虚拟机上启用远程调试时,Azure 会在该虚拟机上安装远程调试扩展。 然后,你可以附加到虚拟机上的进程中,并像平时一样进行调试。

注意

可使用 Visual Studio 2019 中的 Cloud Explorer 对通过 Azure 资源管理器堆栈创建的虚拟机进行远程调试。 有关详细信息,请参阅使用云资源管理器管理 Azure 资源

调试 Azure 虚拟机

  1. 在“服务器资源管理器”中,展开“虚拟机”节点并选择要调试的虚拟机的节点。

  2. 打开上下文菜单,并选择“启用调试”。 当系统询问是否确定要在虚拟机上启用调试时,请选择“是”。

    Azure 会在该虚拟机上安装远程调试扩展以启用调试。

    虚拟机启用调试命令

    Azure 活动日志

  3. 远程调试扩展安装完毕后,打开虚拟机的上下文菜单,并选择“附加调试器...”

    Azure 将获取虚拟机上的进程的列表,并在“附加到进程”对话框中显示这些进程。

    附加调试器命令

  4. 在“附加到进程”对话框中,选择“选择”以将结果列表限制为仅显示要调试的代码类型。 可以调试 32 位或 64 位托管代码和/或本机代码。

    选择代码类型对话框

  5. 在虚拟机上选择要调试的进程,然后选择“附加”。 例如,如果要调试虚拟机上的某个 Web 应用,则可以选择 w3wp.exe 进程。 有关详细信息,请参阅在 Visual Studio 中调试一个或多个进程Azure 角色体系结构

创建用于调试的 Web 项目和虚拟机

在发布 Azure 项目之前,你可能会发现,在支持调试和测试方案并且可以在其中安装测试和监视程序的受控环境中对项目进行测试会很有用。 运行这类测试的方法之一是远程调试虚拟机上的应用。

Visual Studio ASP.NET 项目提供了一个选项,可创建用于应用程序测试且易于操作的虚拟机。 该虚拟机包含通常需要的终结点,例如 PowerShell、远程桌面和 WebDeploy。

创建用于调试的 Web 项目和虚拟机

  1. 在 Visual Studio 中创建一个新的 ASP.NET Web 应用程序。

  2. 在“新建 ASP.NET 项目”对话框的“Azure”部分中,从下拉列表框中选择虚拟机。 保持选中创建远程资源复选框。 选择“确定”以继续。

    此时将出现“在 Azure 上创建虚拟机”对话框。

    “创建 ASP.NET Web 项目”对话框

    注意

    如果尚未登录到 Azure 帐户,系统将要求登录。

  3. 为虚拟机选择各项设置,然后选择确定。 有关详细信息,请参阅虚拟机

    为 DNS 名称输入的名称也就是虚拟机的名称。

    在 Azure 对话框上创建虚拟机

    Azure 将创建虚拟机,然后预配和配置终结点,例如远程桌面和 Web 部署。

  4. 完全配置好虚拟机后,请在服务器资源管理器中选择该虚拟机的节点。

  5. 打开上下文菜单,并选择“启用调试”。 当系统询问是否确定要在虚拟机上启用调试时,请选择“是”。

    Azure 会在该虚拟机上安装远程调试扩展以启用调试。

    虚拟机启用调试命令

    Azure 活动日志

  6. 根据如何:在 Visual Studio 中使用一键式发布来部署 Web 项目中所述的方法发布项目。 由于你想要在虚拟机上进行调试,因此,请在“发布 Web”向导的“设置”页上选择“调试”作为配置。 这可以确保在调试时代码符号可用。

    发布设置

  7. 如果以前已经部署了该项目,请在“文件发布选项”中,选择“删除目标位置的其他文件”

  8. 发布项目之后,在服务器资源管理器中该虚拟机的上下文菜单上,选择“附加调试器...”

    Azure 将获取虚拟机上的进程的列表,并在“附加到进程”对话框中显示这些进程。

    附加调试器命令

  9. 在“附加到进程”对话框中,选择“选择”以将结果列表限制为仅显示要调试的代码类型。 可以调试 32 位或 64 位托管代码和/或本机代码。

    选择代码类型对话框

  10. 在虚拟机上选择要调试的进程,然后选择“附加”。 例如,如果要调试虚拟机上的某个 Web 应用,则可以选择 w3wp.exe 进程。 有关详细信息,请参阅在 Visual Studio 中调试一个或多个进程