Visual Studio 中快照调试的故障排除和已知问题

适用于: Visualstudio

本文提供在 Visual Studio 中使用 Snapshot Debugger 调试 Azure 应用 时可能遇到的常见问题的解决方法。

如果本文中所述的步骤无法解决你的问题,请在开发者社区上搜索问题,或通过在 Visual Studio 中选择“帮助>发送反馈>报告问题”来报告新问题。

问题:“附加快照调试器”遇到 HTTP 状态代码错误

如果在尝试附加期间在 “输出 ”窗口中看到以下错误,则可能是以下部分中列出的已知问题。 尝试建议的解决方案,如果问题仍然存在,请联系前面的别名。

[TIMESTAMP] Error --- Unable to Start Snapshot Debugger - Attach Snapshot Debugger failed: System.Net.WebException: The remote server returned an error: (###) XXXXXX

(401) 未授权

此错误指示 Visual Studio 向 Azure 发出的 REST 调用使用无效的凭据。

执行以下步骤:

  • 确保 Visual Studio 个性化帐户有权访问要附加到的 Azure 订阅和资源。 确定这一点的一种快速方法是从调试>附加快照调试器中检查资源是否在对话框中可用...>Azure 资源>选择“现有”,或在“云资源管理器”中选择。
  • 如果此错误仍然存在,请使用本文开头所述的反馈通道之一。

如果在App 服务上启用了身份验证/授权 (EasyAuth) ,则可能会在调用堆栈错误消息中遇到 LaunchAgentAsync 401 错误。 确保在Azure 门户中将请求未进行身份验证时要执行的操作设置为“允许匿名请求 (无操作) ,并在 D:\Home\sites\wwwroot 中提供包含以下内容的authorization.json

{
  "routes": [
    {
      "path_prefix": "/",
      "policies": {
        "unauthenticated_action": "RedirectToLoginPage"
      }
    },
    {
      "http_methods": [ "POST" ],
      "path_prefix": "/41C07CED-2E08-4609-9D9F-882468261608/api/agent",
      "policies": {
        "unauthenticated_action": "AllowAnonymous"
      }
    }
  ]
}

第一个路由有效地保护应用域,类似于 使用 [IdentityProvider] 登录。 第二个路由在身份验证之外公开 SnapshotDebugger AgentLaunch 终结点,仅当为应用服务启用了 SnapshotDebugger 预安装站点扩展时,该终结点 才会 执行预定义的操作,即启动 SnapshotDebugger 诊断代理。 有关 authorization.json 配置的详细信息,请参阅 URL 授权规则

(403) 禁止

403 - 禁止访问错误指示权限被拒绝。 许多不同的方案可能会导致此错误。

执行以下步骤:

  • 验证 Visual Studio 帐户是否具有有效的 Azure 订阅,该订阅具有对资源的必要 Role-Based 访问控制 (RBAC) 权限。 对于 AppService,检查你是否有权查询托管应用的App 服务计划。
  • 验证客户端计算机的时间戳是否正确且是最新的。 时间戳超过请求时间戳 15 分钟的服务器通常会生成此错误。
  • 如果此错误仍然存在,请使用本文开头所述的反馈通道之一。

找不到 (404)

“404 - 未找到”错误指示无法在服务器上找到网站。

执行以下步骤:

  • 验证是否已在要附加到的App 服务资源上部署并运行网站。
  • https://< resource.azurewebsites.net> 验证站点是否可用
  • 验证在 https:// resource.azurewebsites.net<> 访问时,正确运行的自定义 Web 应用程序不会返回状态代码 404。
  • 如果此错误仍然存在,请使用本文开头所述的反馈通道之一。

(406) 不可接受

406 - 不可接受错误指示服务器无法响应请求的 Accept 标头中设置的类型。

执行以下步骤:

  • https://< resource.azurewebsites.net> 验证站点是否可用。
  • 验证站点是否已迁移到新实例。 Snapshot Debugger 使用 ARRAffinity 的概念将请求路由到可能会间歇性产生此错误的特定实例。
  • 如果此错误仍然存在,请使用本文开头所述的反馈通道之一。

(409) 冲突

409 - 冲突错误指示请求与当前服务器状态冲突。

这是当用户尝试针对已启用 ApplicationInsights 的 AppService 附加 Snapshot Debugger 时出现的已知问题。 ApplicationInsights 使用与 Visual Studio 不同的大小写设置 AppSettings,从而导致此问题。

我们在 Visual Studio 2019 中解决了此问题。

执行以下步骤:

  • 如果此错误仍然存在,请使用本文开头所述的反馈通道之一。

(500) 内部服务器错误

500 - 内部服务器错误错误指示站点已关闭或服务器无法处理请求。 快照调试器仅适用于正在运行的应用程序。 Application Insights 快照调试器 提供异常快照,可能是满足需求的最佳工具。

(502) 错误的网关

502 - 错误的网关错误指示服务器端网络问题,可能是暂时的。

执行以下步骤:

  • 在再次附加快照调试器之前,请尝试等待几分钟。
  • 如果此错误仍然存在,请使用本文开头所述的反馈通道之一。

问题:未打开 Snappoint

如果看到带有快照点而不是常规对齐点图标的警告 图标,则表示不会打开快照点。

显示 Snappoint 未打开的屏幕截图。

执行以下步骤:

  • 请确保使用相同的源代码版本来生成和部署应用。
  • 请确保为部署加载正确的符号。
  • 为此,请在“快照调试”时查看“ 模块 ”窗口,并验证“符号文件”列是否显示正在调试的模块加载的 .pdb 文件。
    • Snapshot Debugger 将尝试自动下载并使用部署符号。

问题:打开快照时未加载符号

如果看到以下窗口,则表示未加载符号。

显示符号未加载的屏幕截图。

执行以下步骤:

  • 在页面上选择“ 更改符号设置...”

  • “调试 > 符号 ”设置中,添加符号缓存目录。

  • 设置符号路径后,重启快照调试。

    项目中可用的符号或 .pdb 文件必须与App 服务部署匹配。 大多数部署 (通过 Visual Studio、CI/CD 和 Azure Pipelines 或 Kudu 等进行部署,) 将符号文件一起发布到App 服务。 设置符号缓存目录可让 Visual Studio 使用这些符号。

    显示符号设置的屏幕截图。

  • 或者,如果组织使用符号服务器或删除其他路径中的符号,请使用符号设置为部署加载正确的符号。

问题:在云资源管理器中看不到“附加快照调试器”选项

执行以下步骤:

  • 确保已安装 Snapshot Debugger 组件。 打开Visual Studio 安装程序,检查 Azure 工作负载中的 Snapshot Debugger 组件。

  • 对于 Visual Studio 2019 或更高版本,请确保应用受支持:

    • Azure 应用服务 - ASP.NET .NET Framework 4.6.1 或更高版本上运行的应用程序。
    • Azure 应用服务 - ASP.NET Core Windows 上 .NET Core 2.0 或更高版本上运行的应用程序。
    • Azure 虚拟机 (和虚拟机规模集) - ASP.NET .NET Framework 4.6.1 或更高版本上运行的应用程序。
    • Azure 虚拟机 (和虚拟机规模集) - ASP.NET Core Windows 上 .NET Core 2.0 或更高版本上运行的应用程序。
    • Azure Kubernetes 服务 - ASP.NET Core Debian 9 上 .NET Core 2.2 或更高版本上运行的应用程序。
    • Azure Kubernetes 服务 - ASP.NET Core在 Alpine 3.8 上的 .NET Core 2.2 或更高版本上运行的应用程序。
    • Azure Kubernetes 服务 - ASP.NET Core在 Ubuntu 18.04 上的 .NET Core 2.2 或更高版本上运行的应用程序。

问题:我只看到诊断工具中的限制快照

显示“已限制的快照点”的屏幕截图。

执行以下步骤:

  • 快照占用的内存很少,但会收取提交费用。 如果快照调试器检测到服务器内存负载过大,则不会创建快照。 可以通过停止快照调试器会话并重试来删除已捕获的快照。

问题:使用多个版本的 Visual Studio 进行快照调试时出现错误 (Visual Studio 2019 或更高版本)

Visual Studio 2019 需要在Azure 应用服务上使用较新版本的 Snapshot Debugger 站点扩展。 此版本与 Visual Studio 2017 使用的旧版 Snapshot Debugger 站点扩展不兼容。 如果尝试将 Visual Studio 2019 中的 Snapshot Debugger 附加到以前由 Visual Studio 2017 中的 Snapshot Debugger 调试的Azure 应用服务,则会出现以下错误:

不兼容的 Snapshot Debugger 站点扩展 Visual Studio 2019 的屏幕截图。

相反,如果使用 Visual Studio 2017 将 Snapshot Debugger 附加到以前由 Visual Studio 2019 中的 Snapshot Debugger 调试过的Azure 应用服务,则会收到以下错误:

不兼容的 Snapshot Debugger 站点扩展 Visual Studio 2017 的屏幕截图。

若要解决此问题,请在 Azure 门户中删除以下应用设置,然后再次附加 Snapshot Debugger:

  • INSTRUMENTATIONENGINE_EXTENSION_VERSION
  • SNAPSHOTDEBUGGER_EXTENSION_VERSION

问题:我附加到错误的/旧的 Azure 资源或存储帐户

执行以下步骤:

“Azure 资源”和“存储帐户”条目使用资源名称作为密钥,因此将资源迁移到不同订阅等操作可能会导致问题。 若要清除列表,请执行以下步骤:

  1. 使用管理员权限) 在 VS (的开发人员命令提示符中运行这些命令。

    vsregedit remove local HKCU SnapshotDebugger AzureResourcesMRU
    vsregedit remove local HKCU SnapshotDebugger StorageAccountsMRU
    
  2. 删除与 Web 应用关联的任何 .suo 文件。

问题:快照调试出现问题,需要启用更多日志记录

启用代理日志

若要启用和禁用代理日志记录,请打开 Visual Studio 并导航到 “工具>选项”“>快照调试器>”“启用代理日志记录”。 请注意,如果还启用了 在会话启动时删除旧代理日志 ,则每次成功的 Visual Studio 附加都将删除以前的代理日志。

可以在以下位置找到代理日志:

  • 应用服务:
    • 导航到App 服务的 Kudu 站点 (即<你的应用服务>。scm.azurewebsites.net) 并导航到“调试控制台”。
    • 代理日志存储在以下目录中: D:\home\LogFiles\SiteExtensions\DiagnosticsAgentLogs\
  • VM/VMSS:
    • 登录到 VM,代理日志存储如下: C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<Version>\SnapshotDebuggerAgent*.txt_
  • AKS
    • 导航到以下目录: /tmp/diag/AgentLogs/*

启用探查器/检测日志

可以在以下位置找到检测日志:

  • 应用服务:
    • 错误日志记录会自动发送到 D:\Home\LogFiles\eventlog.xml,事件标记为 <Provider Name="Instrumentation Engine" /> 或“生产断点”
  • VM/VMSS:
    • 登录到 VM 并打开事件查看器。
    • 打开以下视图: Windows 日志>应用程序
    • 使用生产断点检测引擎事件源筛选当前日志
  • AKS
    • 在 DockerFile) 中设置MicrosoftInstrumentationEngine_FileLogPath的检测引擎日志记录 (/tmp/diag/log.txt
    • /tmp/diag/shLog.txt 处的 ProductionBreakpoint 日志记录

已知问题

  • 当前不支持针对同一App 服务使用多个 Visual Studio 客户端进行快照调试。
  • ASP.NET Core项目中并不完全支持 Roslyn IL 优化。 对于某些 ASP.NET Core项目,可能无法在条件语句中看到某些变量或使用某些变量。
  • 特殊变量(如 $FUNCTION$CALLER)不能在 ASP.NET Core项目的条件语句或日志点中求值。
  • 快照调试不适用于已启用 本地缓存 的应用服务。
  • 目前不支持快照调试 API 应用。

站点扩展升级

快照调试和 Application Insights 依赖于 ICorProfiler,ICorProfiler 会加载到站点进程并在升级过程中导致文件锁定问题。 建议使用此过程,以确保生产站点不会有停机。

  • 在App 服务中创建部署槽,并将站点部署到槽。
  • 从 Visual Studio 中的云资源管理器或Azure 门户交换槽与生产。
  • 停止槽站点。 从所有实例中终止站点 w3wp.exe 进程需要几秒钟时间。
  • 从 Kudu 站点或 Azure 门户 (App 服务 边栏选项卡>开发工具>扩展更新) 升级槽站点扩展>
  • 启动槽站点。 我们建议再次访问网站来预热。
  • 将槽与生产环境交换。

References