Windows云计算系统虚拟化

分享用于内嵌式Nested Hyper-V虚拟机的NMI触发脚本,以便收集完全内存转储【原创文章】

有时候我们经常需要调试有性能问题的Windows VM,那么手动使用NMI进行Crash然后收取Dump进行分析的话是必不可少的步骤,或者是使用Hyper-V的CheckPoint(检查点功能)来获取Dump。然而在Nested Hyper-V中这些手段将受到限制,CheckPoint的方法将不可用,因此触发NMI将成为唯一的选项。

因此,我创建了以下Windows批处理以便简化操作流程。

[本文为AndyX.Net原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明!]

[本人中所有涉及到的实验均在 Azure VM 中进行配置,同样适用于其他云环境的虚拟机]

[如果本文章帮助到了您,请Feel free在文章末尾“打赏”作者,感谢!]

 

使用前提

在GuestOS中需要手动配置Full Memorydump(完全内存转储)以及NMI触发器:

REM For full DMP
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f
  

REM For NMI trigger
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f 

REM Restart the VM so the changes takes a place
shutdown /r /t 0 /f

如果GuestOS无法操作,你依然可以尝试挂载注册表的方法手动修改GuestOS中的注册表键值。

 

批处理脚本

@cls
@echo off
REM Auto Admin - Code Start
%1 %2
ver|find "5.">nul&&goto :Admin
@mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
:Admin
REM Auto Admin - Code End
@Title Nested Hyper-V NMI trigger - Created by AndyX [Azure VM] 2020.09.21
@color b
@echo Nested Hyper-V NMI trigger - Created by AndyX [Azure VM] 2020.09.21
@ping -n 2 127.0.0.1  > nul
@cls
@echo Please make sure the Hyper-V VM is running.....
@echo.
@echo Checking all VM status:
@PowerShell -Command "& {get-vm | Select-Object name,state,uptime }"
@ping -n 2 127.0.0.1 > nul
@set /p vmname="Please Type the Hyper-V VM name: " & echo.
@echo.
@PowerShell -Command "& {debug-vm '%vmname%' -InjectNonMaskableInterrupt -Force}" > nul
@pause

REM --------------------------------------------------------------------------------------
REM This script is used to easy troubleshooting of WindowsOS in nested Hyper-V environment
REM My Website: http://andyx.net/
REM --------------------------------------------------------------------------------------

将以上脚本保存至txt文档,并重命名扩展名为“OneKeyDump for Nested Hyper-V.cmd”。

 

使用方法

将该批处理放置在Host/Rescue VM上

保持Nexted Hyper-V开启,运行此脚本,复制VM在Nested Hyper-V的名称,并准备复现问题

一旦问题复现,直接敲回车键即可看到Bugcheck触发,然后系统会自动收集完全内存转储

分享用于内嵌式Nested Hyper-V虚拟机的NMI触发脚本,以便收集完全内存转储【原创文章】插图

 

参考文献

Debug-VM (Hyper-V) | Microsoft Docs

 

(全文完)

 

文章撰写:作者AndyX,来自AndyX.Net

文章遵循 CC 4.0 BY-SA 版权协议,若需转载本文,请标注来源与链接:原创内容AndyX.Net版权所有

本文地址:【原创文章】分享用于内嵌式Nested Hyper-V虚拟机的NMI触发脚本,以便收集完全内存转储 – AndyX.Net – 安迪克斯