Hyper-V在线抓取VM Memory Dump

在解决问题的过程中,碰到一些hang或者crash的情况,或者一些不明原因,除了抓取一般的日志,Memory Dump往往能够起到意想不到的作用。但是在物理服务器的环境下,如果要进行Complete(Full) Memory Dump基本都需要触发Windows Crash才可以收集,这对某些服务以及业务的影响过于大,而且,有些场景的特殊,导致我们无法很方便的获取到Memory dump。

现如今,大量的业务迁移到虚拟化平台,服务器虚拟化的引入对于Memory dump的抓取也提供了很好的支持,这极大的方便了我们排错的过程,同时,最大限度的降低对当前业务的影响。

以下介绍Hyper-V环境下通过宿主机抓取Windows Guest VM Full Memory dump:

  1. 大多数企业环境Hyper-V Host 一般都运行在隔离的内网中,所以,我们需要先在能够接入internet的机器上获取所需的Symbol文件
  2. 下载安装windows debugging tools(包含在Windows SDK中),建议直接下载最新版本的SDK即可,安装的时候可以选择只勾选Debugging tools for windows.
    1. Windows 10 SDK:http://go.microsoft.com/fwlink/p/?LinkId=536682
    2. Windows 8.1 SDK:http://msdn.microsoft.com/en-US/windows/desktop/bg162891
    任选其一就可以了
  3. 下载LiveKd,后续主要使用该工具进行抓取Memory Dump,下载地址:https://technet.microsoft.com/en-us/sysinternals/bb897415.aspx , 解压后放到WinDbg的目录下即可。
    根据安装途径的不同,Windbg的目录也有些差异,具体的路径还请根据实际情况调整,一些常见的目录
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
    C:\Program Files\Debugging Tools for Windows\
  4. 在可以接入Internet的机器上安装Windows debugging tools来获取Symbol文件
    1. 首先从Hyper-V host上从c:\Windows\System32\目录下复制ntoskrnl.exe, ntkrnlpa.exe, kernel32.dll, ntdll.dll到本地C:\Debug目录。注意:有些文件可能不存在,忽略即可。
    2. 打开命令行,然后切换到WinDbg所在目录
    3. 执行:Symchk.exe /if C:\Debug\*.* /s srv*C:\Symbols\*http://msdl.microsoft.com/download/symbols
    4. 上面的命令会把Debug目录下文件的Symbol下载到C:\Symbols目录下
  5. 获取到Symbols文件之后,把该目录下的文件全部复制到Hyper-V Host的C:\Symbols目录下备用
  6. 使用管理员打开CMD,切换到WinDbg目录下,然后执行:LiveKd.exe (执行后,不要关闭当前窗口)
    1. LiveKd执行后,第一次会尝试设置环境变量以及symbols位置等信息
    2. 选择Y同意设置环境变量
    3. 然后回车,使用默认的Symbol路径,也就是上面的C:\Symbols
    liveKd
  7. 使用管理员再打开一个CMD,同样切换到WinDbg目录下,执行以下命令抓取Dump
    1. 创建一个目录保存Dump文件,比如C:\Dumps
    2. LiveKd.exe -hv -p -o C:\dumps\vm_name.dmp
    注: 可以使用LiveKd.exe -hvl查看VM列表