Visual Studio 中的快照调试疑难解答和已知问题
适用于: Visual Studio
本文介绍在 Visual Studio 中使用 Snapshot Debugger 调试 Azure 应用时可能会遇到的常见问题。
如果本文中所述的步骤无法解决问题,请在 Visual Studio 中选择“帮助>发送反馈>报告问题”,在开发者社区上搜索问题或报告新问题。
问题:“附加 Snapshot Debugger”遇到 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 订阅和资源。 一种快速确定方法是检查该资源是否出现在“调试”>“附加 Snapshot Debugger...”>“Azure 资源”>“选择现有资源”的对话框或 Cloud Explorer 中。
- 如果此错误仍然存在,请使用本文开头所述的任一反馈渠道进行反馈。
如果已在应用服务上启用身份验证/授权 (EasyAuth),则可能会遇到 401 错误,并且调用堆栈错误消息中会显示 LaunchAgentAsync。 确保在请求未经身份验证时要执行的操作设置为“允许匿名请求”(无操作)在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 订阅,并对该资源具有必要的基于角色的访问控制 (RBAC) 权限。 对于 AppService,请检查是否有权查询托管应用的应用服务计划。
- 验证客户端计算机的时间戳是否是正确且最新的。 如果服务器的时间戳与请求时间戳相差 15 分钟以上,则通常会产生此错误。
- 如果此错误仍然存在,请使用本文开头所述的任一反馈渠道进行反馈。
(404) 未找到
404 - 未找到错误表示无法在服务器上找到该网站。
执行以下步骤:
- 验证是否已在要附加的应用服务资源上部署并运行网站。
- 验证站点在 https://< resource.azurewebsites.net> 中是否可用
- 验证在 https://< resource.azurewebsites.net> 访问时,正确运行的自定义 Web 应用程序不会返回状态代码 404。
- 如果此错误仍然存在,请使用本文开头所述的任一反馈渠道进行反馈。
(406) 不可接受
406 - 不可接受错误表示服务器无法响应请求的 Accept 标头中设置的类型。
采取以下步骤:
- 验证站点在 https://< resource.azurewebsites.net> 中是否可用。
- 验证站点是否已迁移到新实例。 Snapshot Debugger 使用 ARRAffinity 的概念将请求路由到可间歇性产生此错误的特定实例。
- 如果此错误仍然存在,请使用本文开头所述的任一反馈渠道进行反馈。
(409) 冲突
409 - 冲突错误指示请求与当前服务器状态冲突。
这是一个已知问题,在用户尝试将 Snapshot Debugger 附加到已启用 ApplicationInsights 的 AppService 时会发生。 ApplicationInsights 使用与 Visual Studio 不同的大小写设置 AppSettings,从而导致此问题。
我们在 Visual Studio 2019 中解决了此问题。
执行以下步骤:
- 如果此错误仍然存在,请使用本文开头所述的任一反馈渠道进行反馈。
(500) 内部服务器错误
500 - 内部服务器错误错误指示站点已关闭或服务器无法处理请求。 Snapshot Debugger 仅在正在运行的应用程序上运行。 Application Insights Snapshot Debugger 可提供有关异常的快照,并且可能是满足需求的最佳工具。
(502) 错误的网关
502 - 错误的网关错误指示服务器端网络问题,可能是暂时性的。
执行以下步骤:
- 请尝试等待几分钟,然后再次附加 Snapshot Debugger。
- 如果此错误仍然存在,请使用本文开头所述的任一反馈渠道进行反馈。
问题:未打开 Snappoint
如果看到带有快照点而不是常规对齐点图标的警告图标 ,则不会打开快照点。
采取以下步骤:
- 请确保使用相同的源代码版本来生成和部署应用。
- 请确保为部署加载正确的符号。
- 为此,在 快照调试时查看“模块 ”窗口,并验证符号文件列显示 为正在调试的模块加载的 .pdb 文件。
- Snapshot Debugger 将尝试自动下载符号并将其用于你的部署。
问题:打开快照时符号不会加载
如果看到以下窗口,则符号未加载。
采取以下步骤:
选择 页面上的“更改符号设置...” 。
在“调试”>“符号”设置中,添加符号缓存目录。
设置符号路径后,重启快照调试。
项目中可用的符号或 .pdb 文件必须与App 服务部署匹配。 大多数部署(通过 Visual Studio 进行部署、使用 Azure Pipelines 或 Kudu 等的 CI/CD)将符号文件连同App 服务一起发布。 通过设置符号缓存目录,Visual Studio 可以使用这些符号。
或者,如果你的组织使用符号服务器或将符号置于不同的路径,请使用符号设置为你的部署加载正确的符号。
问题:我在云资源管理器中看不到“附加快照调试器”选项
执行以下步骤:
确保安装了 Snapshot Debugger 组件。 打开 Visual Studio 安装程序,然后选中 Azure 工作负载中的“Snapshot Debugger”组件。
对于 Visual Studio 2019 或更高版本,请确保支持你的应用:
- Azure 应用服务 - 在 .NET Framework 4.6.1 或更高版本上运行的 ASP.NET 应用程序。
- Azure 应用服务 - 在 Windows 中的 .Net Core 2.0 或更高版本上运行的 ASP.NET Core 应用程序。
- Azure 虚拟机(以及虚拟机规模集)- 在 .NET Framework 4.6.1 或更高版本上运行的 ASP.NET 应用程序。
- Azure 虚拟机(以及虚拟机规模集)- 在 Windows 中的 .Net Core 2.0 或更高版本上运行的 ASP.NET Core 应用程序。
- Azure Kubernetes 服务 - 在 Debian 9 中的 .Net Core 2.2 或更高版本上运行的 ASP.NET Core 应用程序。
- Azure Kubernetes 服务 - 在 Alpine 3.8 中的 .Net Core 2.2 或更高版本上运行的 ASP.NET Core 应用程序。
- Azure Kubernetes 服务 - 在 Ubuntu 18.04 中的 .Net Core 2.2 或更高版本上运行的 ASP.NET Core 应用程序。
问题:在诊断工具中只能看到已阻止的快照
执行以下步骤:
- 快照占用很少的内存,但确实存在内存使用。 如果 Snapshot Debugger 检测到服务器的内存负载过大,则不会创建快照。 可以通过停止 Snapshot Debugger 会话来删除已捕获的快照,然后重试。
问题:使用多个版本的 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 App 服务,则会收到以下错误:
相反,如果使用 Visual Studio 2017 将快照调试器附加到以前由 Visual Studio 2019 中的 Snapshot Debugger 调试的Azure App 服务,则会出现以下错误:
若要解决此问题,请在 Azure 门户中删除以下应用设置,并再次附加 Snapshot Debugger:
INSTRUMENTATIONENGINE_EXTENSION_VERSION
SNAPSHOTDEBUGGER_EXTENSION_VERSION
问题:我附加到错误的/旧的 Azure 资源或存储帐户
执行以下步骤:
“Azure 资源”和“存储帐户”条目使用资源名称作为密钥,因此,将资源迁移到不同订阅等操作可能会导致问题。 若要清除列表,请按照以下步骤操作:
在面向 VS 的开发人员命令提示符中运行这些命令(具有管理员权限)。
vsregedit remove local HKCU SnapshotDebugger AzureResourcesMRU vsregedit remove local HKCU SnapshotDebugger StorageAccountsMRU
删除与 Web 应用关联的任何 .suo 文件。
问题:快照调试出现问题,需要启用更多日志记录
启用代理日志
若要启用和禁用代理日志记录,请打开 Visual Studio 并导航到 “工具>选项>快照调试器>启用代理日志记录”。 请注意,如果 同时启用了会话启动 时删除旧的代理日志,则每个成功的 Visual Studio 附加都将删除以前的代理日志。
可以在以下位置找到代理日志:
- App 服务:
- 导航到App 服务的 Kudu 站点(即 <yourappservice)。>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/*
启用 Profiler/Instrumentation 日志
可以在以下位置找到检测日志:
- App 服务:
- 错误日志记录会自动发送到 D:\Home\LogFiles\eventlog.xml,事件标记为
<Provider Name="Instrumentation Engine" />
“生产断点”
- 错误日志记录会自动发送到 D:\Home\LogFiles\eventlog.xml,事件标记为
- VM/VMSS:
- 登录到 VM 并打开事件查看器。
- 打开以下视图:“Windows 日志”>“应用程序”。
- 使用生产断点或检测引擎按事件源 筛选当前日志。
- AKS
- /tmp/diag/log.txt(在 DockerFile 中设置
MicrosoftInstrumentationEngine_FileLogPath
)的检测引擎日志记录 - /tmp/diag/shLog.txt 的 ProductionBreakpoint 日志记录
- /tmp/diag/log.txt(在 DockerFile 中设置
已知问题
- 目前不支持针对同一App 服务使用多个 Visual Studio 客户端进行快照调试。
- ASP.NET Core 项目中不支持 Roslyn IL 优化。 对于部分 ASP.NET Core 项目,你可能无法看到某些变量,或者无法在条件语句中使用某些变量。
- 无法在 ASP.NET Core 项目的条件语句或日志点中计算特殊变量,例如
$FUNCTION
$CALLER
或无法计算这些变量。 - 快照调试不适用于已启用本地缓存的App 服务。
- 目前不支持快照调试 API 应用。
站点扩展升级
快照调试和 Application Insights 依赖于 ICorProfiler,该工具会加载到站点过程并在升级过程中导致文件锁定问题。 建议执行此过程,以确保生产站点没有停机。
- 在应用服务中创建部署槽位并将你的站点部署到槽。
- 从 Visual Studio 中的 Cloud Explorer 或从 Azure 门户交换生产槽。
- 停止槽站点。 从所有实例中终止站点 w3wp.exe 进程需要几秒钟时间。
- 从 Kudu 站点或 Azure 门户升级槽站点扩展(“应用服务边栏选项卡”>“开发工具”>“扩展”>“更新”)。
- 启动槽站点。 建议访问该站点以再次将其预热。
- 交换生产槽。