排查分析错误并修复问题

本文提供了一些最常见错误的解决方案,这些错误可能会阻止从 Visual Studio 的性能探查器使用或获取足够的数据。

无结果

错误:“当前筛选器集中没有数据”

打开 diagsession 文件时,会应用某些筛选器,例如隐藏本机代码或隐藏非用户代码,使跟踪更易于理解。 此外,还可以应用其他筛选器,例如“时间选择”和“线程”,从而进一步缩小显示的数据范围。 如果应用这些筛选器后,导致没有剩余的数据可以显示,你将看到此警告。

如何解决

  • 确保时间选择中包含数据。 如果在数据上方的图形中更改了时间选择,请选择“清除选择”以重置它。
  • 接下来,如果仍然没有数据,请确保在其各自的下拉列表中启用所有类别和线程。
  • 如果要分析的应用程序是本机代码,请确保在“设置”下拉列表中启用“显示本机代码”选项。
  • 如果仍然没有数据,表明收集的跟踪可能太短,无法显示任何数据。 确保要为其收集数据的程序不会太快地完成(少于一秒钟)。

另请参阅:显示外部代码

结果需要很长时间才能完成

如果在收集后分析堆的加载速度似乎很慢,请参阅以下可能的解决方案,可以帮助解决等待时间问题。

如何修复 - 有时,尝试分析内存密集型应用程序中的快照可能需要更长的时间,但升级到到更新版本的 Visual Studio 应该会减少分析的等待时间。 如果在升级后此问题仍然存在,表明工具可能存在性能 bug。 创建反馈票证并共享已创建的 diagsession 文件。 通过该文件,我们可以确定数据分析速度缓慢的原因,并确定我们可以在哪里进行性能改进。

请务必在“反馈”票证中提供跟踪和堆转储文件。

另请参阅:

错误“无法为此 diagsession 创建清单文件”或错误“无法为 diagsession 创建清单文件,Visual Studio 将无法重新打开此会话。”

此问题意味着在停止收集数据后准备要分析和显示的内存快照数据时出现问题。 出现此问题的潜在原因有多种,从通过收集代理获取正确信息失败,到实际数据处理,都有可能。 因此,如果不进一步记录,就无法诊断问题。

如何修复 - 使用其他日志记录信息回复“反馈”票证,帮助诊断问题。 通过从提升的命令提示符运行以下命令,获取日志信息:

reg add HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\DiagnosticsHub /v LogLevel /t REG_SZ /d All /reg:32
reg add HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\DiagnosticsHub /v LogDirectory /t REG_SZ /d [directory of your choice] /reg:32

运行这些命令后,启动 Visual Studio,重现场景,关闭 Visual Studio,然后压缩所选的 DiagnosticsHub 日志目录并将其附加到此票证。 此时,我们应该能够更好地诊断出发生了什么。

将日志添加到票证后,运行以下命令以禁用日志记录:

reg delete HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\DiagnosticsHub /f /v LogLevel /reg:32
reg delete HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\DiagnosticsHub /f /v LogDirectory /reg:32

错误:“源信息不可用。”

若要查看源信息,需要有收集时的 PDB 可用。 例如,如果收集 CPU 使用率 diagsession 文件,对代码进行一些更改,重新编译(替换旧的 PBD),然后再次打开 .diagsession,你将不太可能会看到已更新的代码模块的源信息。

如何修复 - 此问题的最简单解决方法是在进行更改后收集新的 diagsession。 这样就可以确保 PDB 是最新的。

错误:“由于内部错误,内存分析失败。”

在长时间的内存分析会话后,分析结果的任何尝试都会出现错误。

内存工具捕获的快照信息与收集代理的快照信息不一致。 此结果意味着内存工具无法找到本机快照的堆状态文件。 或者,内存工具无法将快照的 GC 开始时间与 diagsession 文件中注册的用于检索 GCStats 的时间相匹配。

如何修复 - 此问题是由于工具中的 bug(已在 17.3 中修复)所致。 升级到更高版本应该可以解决此问题。 如果在升级后问题仍然存在,请创建反馈票证并附加到票证:

  • diagsession 文件
  • Visual Studio 的小型转储
  • 已创建的内存快照的屏幕截图。

此问题没有解决方法,需要重启分析会话。

错误:“X 个诊断事件已删除,报告中的某些信息可能缺失或不准确”

有时,在数据捕获期间,可能会删除可能导致生成的分析报告不准确或不可用的事件。 删除事件可能因多种不同原因而发生,但主要发生在系统无法以比传入速率更快的速度将事件刷新到磁盘时。

如何修复 为了帮助减少删除事件,可以在分析时关闭其他磁盘和 CPU 密集型操作。 通过关闭这些操作,系统可将更多的资源用于刷新传入事件。 还可以尝试降低支持这些配置设置的工具(例如 CPU 使用率工具和 .NET 分配工具)的采样频率,从而减少开销。

错误:ETW 资源已用尽

Visual Studio 探查器使用 Windows 事件跟踪 (ETW) 来收集其性能信息。 系统上有数量有限的 ETW 会话可供使用,如果所有会话都已在使用中,则会收到以下错误:ETW resources have been exhausted。 这些会话由其他程序使用,例如 SysInternals 工具套件、其他探查器和其他诊断工具。 可以通过以下任一方法解决此问题:

  • 关闭使用会话释放资源的程序,或

  • 通过从提升的命令提示符运行以下命令,然后重新启动来预留更多资源:

    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI" /v EtwMaxLoggers /t REG_DWORD /d 128
    

    运行此命令会将默认会话数从 64 增加到 128(256 是系统上允许的最大会话数)。

错误:CPU 使用率工具在 ARM64 VM 上无法工作

Visual Studio 探查器使用 Windows 事件跟踪 (ETW) 来收集其性能信息。 目前,在虚拟机 (VM) 中运行时,Windows for ARM64 不支持使用 ETW 收集配置文件示例。 若要绕过此限制,可以在实际的 ARM64 设备上使用 CPU 使用率工具,或使用检测工具来捕获计时信息。

错误:内存使用情况工具无法在启用了服务器 GC 的 .NET 7 和 .NET 运行时 8.0.0-8.0.1 上运行

由于 .NET 7 运行时引入并传播到 .NET 8 运行时版本 8.0.0 和 8.0.1 的问题,因此在使用服务器垃圾回收时无法枚举对象。 ASP.NET Core 应用程序默认启用服务器垃圾回收。

如何修复

若要解决此问题,请执行以下操作:

  • 在创建快照或收集应用程序的转储时禁用服务器垃圾回收。
  • 使用不受影响的 .NET 运行时版本。

另请参阅: