尝试从群集环境中运行的虚拟机获取完整内存转储文件时损坏的内存转储文件

本文提供了在尝试从虚拟机获取完整内存转储文件时生成损坏的内存转储文件的问题的解决方案。

适用于: Windows Server 2012 R2
原始 KB 编号: 2913486

症状

你有一个在 Windows Server 2012 或 Windows Server 2008 R2 的群集环境中运行的虚拟机。 尝试从虚拟机获取完整的内存转储文件时,会生成损坏的内存转储文件。 加载内存转储文件时,可能会收到以下消息:


此转储文件已部分损坏。

KdDebuggerDataBlock 不存在或不可读。


GetContextState 失败,0xD0000147

无法获取程序计数器

GetContextState 失败,0xD0000147

无法获取当前计算机上下文,NTSTATUS 0xC0000147

此外,你可能会注意到写入完整内存转储文件未完成,并且虚拟机在群集中的其他节点上重新启动。

原因

出现此问题的原因是为 虚拟机选择了“为虚拟机启用检测信号监视 ”选项。 此选项在一分钟后重置群集虚拟机, (默认值) ,群集虚拟机需要一分钟的时间才能完成内存转储的写入。

注意

虚拟机和 Virtual Machine Manager 之间的检测信号每隔几秒钟发生一次。 它可能需要长达一分钟才能检测到虚拟机是否关闭,因为虚拟机资源在其 isAlive 入口点函数中从 Virtual Machine Manager 检查检测信号状态。 默认情况下,isAlive 每分钟发生一次。 但是,检测信号可能会在 1 分钟间隔前 30 秒停止。 在这种情况下,群集可以在同一服务器上重启虚拟机,或将其故障转移到另一个节点。

解决方案

若要解决此问题,请禁用 “为虚拟机启用检测信号监视 ”选项。

选项 1:更改 GUI 中的设置

  1. 打开故障转移群集管理器。
  2. 单击“ 角色”,然后找到虚拟机资源。
  3. 在“资源”选项卡上,右键单击虚拟机。
  4. 单击“ 属性”,然后单击“ 设置” 选项卡。
  5. “检测信号设置”中,单击以清除“为应用程序运行状况监视检查启用自动恢复”框。
  6. 单击以清除“为虚拟机启用检测信号监视检查”框,然后单击“确定”。

选项 2:使用 Windows PowerShell 更改设置

  1. 启动 Windows PowerShell。

  2. 检查虚拟机名称。 为此,请键入以下Windows PowerShell命令:

    PS C:\> Get-ClusterResource
    
  3. 检查是否选择了 “为虚拟机启用检测信号监视 ”和 “为应用程序运行状况监视启用自动恢复” 选项。 为此,请键入以下Windows PowerShell命令:

    PS C:\> Get-ClusterResource <VirtualMachineName> | Get-ClusterParameter CheckHeartbeat
    
  4. 当 CheckHeartbeat 值为 1 时,将选中这两个选项。 若要取消这两个选项,请将此值更改为 0。 为此,请键入以下Windows PowerShell命令:

    PS C:\> Get-ClusterResource <VirtualMachineName> | Set-ClusterParameter CheckHeartbeat 0
    

    如果只想取消“为应用程序运行状况监视启用自动恢复”选项,则应运行以下Windows PowerShell命令:

    PS C:\> (Get-ClusterResource <Object>).EmbeddedFailureAction = 1
    

更多信息

已成功写入微型和内核内存转储文件。 这是因为写入这些文件所需的时间不会超过一分钟的阈值。