排查分析错误并修复问题

本文提供了一些最常见的错误的解决方案,这些错误可以防止使用或从 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 ,则可能无法查看更新的代码模块的源信息。

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

错误:“内存分析因内部错误而失败。

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

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

如何修复 此问题是由于 Visual Studio 2022 版本 17.3 中修复的工具中的 bug 导致的。 升级到更高版本应该能解决问题。 如果在升级后问题仍然存在,请创建反馈票证并附加到票证:

  • 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 上使用 ETW 收集配置文件示例。 若要解决此限制,可以使用实际 ARM64 设备上的 CPU 使用率工具或使用检测工具捕获计时信息。

错误:内存使用情况工具不适用于启用了服务器 GC 的 .NET 7 和 .NET Runtime 8.0.0-8.0.1

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

如何修复

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

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

另请参阅: