我有一台 HP Z440 工作站(E5-1680v4 和 128 GB RAM,BIOS 2.39 Rev.A),并且正在使用 Visual Studio Professional 2013(更新 5)。操作系统是 Windows 7 64 位。
例如,当我在 C# 项目中使用 Visual Studio 中的 Profiler 时,它会崩溃并重新启动/重启我的电脑。
以下步骤重现了该问题:
- 启动电脑并打开 Visual Studio
- 创建 C# 控制台应用程序 (.NET 4.0)
- 添加
Console.WritLine("Hello World :-(");
到主要方法。 - 菜单/分析/性能和诊断。
- CPU 采样。
- 选择项目
HelloWorld
作为示例。 - 创建演出会议所需的所有信息均已收集。
- 点击
Finish
(Lunch profiling after the wizard finishes
已勾选)。 - 在以下对话框中单击“是”。
- Windows 正在要求提供管理员凭据,我可以向他提供。
- 我可以看到第二个标签页 (*.vsp) 显示
Start the profiler
。之后PC 崩溃并重新启动。
重启后,我在系统日志中看到一个严重错误:
系统在未先彻底关闭的情况下重新启动。如果系统停止响应、崩溃或意外断电,则可能导致此错误。
知道会发生什么吗?去年 (2017),我能够在同一台 PC 上使用 Visual Studio 2013 的 Profiler。唯一改变的是 Windows 更新和 BIOS(进行 Meltdown 和 Spectre)。
我该怎么做才能再次分析我的代码?
答案1
最近,MS 提供了注册表设置来禁用 Spectre/Meltdown 补丁。如果您的开发环境的安全配置文件可以接受禁用这些补丁,则这些设置将允许分析器再次运行:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v FeatureSettingsOverride /t REG_DWORD /d 3 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f
重新启动后,分析器就可以再次工作了。
答案2
这是由 1 月份的 Windows 更新引起的。看起来这个问题不会得到解决,请参阅 Allen Denver 的以下评论:
很抱歉您看到此问题发生。最近发布的 Windows 7 安全补丁(“Meltdown/Spectre”安全补丁)导致所有版本的 Visual Studio 性能向导和 VSPerfCMD 命令行实用程序在采样模式下使用时重新启动计算机,而不会出现警告或事件日志条目。此问题仅在用于收集 CPU 或 .Net 内存分配堆栈时影响采样。检测模式不受影响。同样,争用模式也不受影响。Windows 8+ 上支持的分析操作也不受此问题影响。
导致此问题的原因是,安全补丁之后,采样分析器以前支持的操作不再被允许。安全补丁修改了 Windows 7 操作系统内核,我们使用的低级数据收集代码导致机器重启。发生这种情况时,不会出现蓝屏,也不会产生事件日志条目。问题甚至发生在操作系统的这些设施之下。此原因类似于 Windows 8 中对 Windows 操作系统内核所做的更改,这导致我们大幅修改 Visual Studio 分析器以使用不同的技术来收集采样分析数据。Windows 8 不允许 Windows 7 中使用的收集技术。现在,有了安全补丁,Windows 7 也不允许该技术。
幸运的是,我可以推荐几种解决方法。这些解决方法并不完美。它们存在局限性,我们希望将来能尽快解决这些局限性以弥补不足,但在我们努力弥补这些不足的同时,这些方法至少可以用来进行一些性能分析。
我正在编写一份很长的文档,其中详细描述了解决方法。它太长了,无法在这里单独发布。因此,我将把它分成多个回复。当我在网上有地方放它时,我也会发布指向单个文档的链接。
艾伦丹佛
视觉工作室
和
我们打算发布一个补丁,通过禁止启动采样收集会话来避免重启行为。但是,这不是一个“修复”。我们没有计划让性能资源管理器、性能向导、VSPerfASPNetCMD 或 VSPerfCMD 采样在 Windows 7 上工作。我们的前进方向是使用 CPU 使用率工具和诊断中心(又名“性能分析器”)。
解决方法 1
对于 Windows 7 和 Visual Studio 2013,没有好的解决方法,请参阅 Allen Denver 的评论:
对于 VS2013 和之前版本的 Visual Studio,您可以改用 Instrumentation 方法进行分析。
因此您不能再在 Windows 7 和 Visual Studio 2013 中使用 CPU 采样模式。
解决方法 2
我认为切换到 Windows 10 和 Visual Studio 2017 是可行的方法,另请参阅 Allen Denver 的评论:
Visual Studio 2017 中使用采样技术的性能向导和性能资源管理器分析将在 Windows 10 上运行。在 Win 8+ 的情况下,我们更改了收集器以使用不同的一组操作系统功能而不是我们自己的内核驱动程序来获取堆栈跟踪。