原总结debug调试kernel debugwindbgbcdeditvirtualKD转储双机调试双机内核调试

前言

当我们没有两台物理机时,又想做双机内核调试怎么办?当然是装虚拟机啦!本文总结了使用 ​​VMware15.5 + win10 + virtualkd + windbg​​ 搭建双机内核调试环境。

安装环境


  1. ​VMware​​ 版本: ​​15.5 pro​​ 。可以到 VMware 官网下载地址 下载最新版本。
  2. 我的物理主机系统:​​win10 1909​​。其它版本的 ​​windows​​ 也可以,​​VMware15.5​​ 最低支持 ​​win7​​ 系统。
  3. 虚拟机系统镜像:​​win10 1809 x64​​。其它版本的系统也可以。我们可以在上面找到各个版本的 ​​windows​​​ 官方镜像。除了系统镜像,还包括其它很多工具的官方镜像,比如 ​​vs​​​, ​​office​​​ 等。
    使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_串口
  4. ​windbg​​版本:​​10.0.18362.1​​,其它版本的也可以。​​windbg​​ 包含在 ​​windows sdk​​ 中。可以到微软官网 SDK 下载地址 下载。如果只需要 ​​windbg​​,推荐下载 ​​.exe​​ 形式的安装包。在安装的时候,可以只勾选 ​​Debugging Tools for Windows​​。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_内核调试_02

只下载 debugging tools



安装 VMware & 安装 win10

下载 ​​VMware​​ 到本地后,直接双击即可安装,一路点击 ​​下一步​​ 即可。需要注意以下两点:


  1. 尽量下载最新版本的 VMware
    ,早期版本的 VMware
    在 win10 1909
    上可能有兼容性问题。
  2. 安装完成后,最好重启系统!

安装好 ​​VMware​​ 后,就可以安装系统镜像了。通过 ​​文件(F) -> 新建虚拟机(N)​​ 即可开始 ​​新建虚拟机向导​​。一般我们通过 ​​安装程序光盘映像文件(iso)(M)​​ 的形式选择下载好的系统镜像安装,然后一路 ​​下一步(N)​​ 即可。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_重启_03

选择系统镜像


安装完成后,可以启动了。但是可能遇到一些问题,我做了简单的总结。


可能遇到的问题


  • 提示 ​​Intel VT-x​​ 被禁用。
    使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_重启_04

根据提示,在 ​​BIOS​​ 里开启 ​​Intel VT-x​​。重启进入​​BIOS​​ ,打开 ​​Intel Virutal Technology​​,按 ​​F10​​ 保存退出。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_内核调试_05

在BIOS中开启VT-x



  • 提示 VMware Workstation
    与 Device/Credential Guard
    不兼容。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_重启_06

incompatible-with-credential-guard


强烈建议先检查下 ​​Hyper-V​​ 是否开启,如果开启了,请先关闭 ​​Hyper-V​​。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_串口_07

关闭 Hyper-V


如果关闭 ​​Hyper-V​​ 后还是出现上图的提示。请参考 ​禁用 Device/Credential Guard 的微软官方文档。

点击工具下载链接,下载相应的脚本文件到本地。如果我们的系统不是英文系统,按照提示改变脚本里的

​*$OSArch = $(gwmi win32_operatingsystem).OSArchitecture​​ 为 ​​$OSArch = $((gwmi win32_operatingsystem).OSArchitecture).tolower()​​然后以管理员权限执行 ​​DG_Readiness_Tool_v3.6.ps1 -Disable -AutoReboot​​ 即可。​​-Disable​​ 表示关闭。​​-AutoReboot​​ 表示自动重启系统,根据自己的需要指定。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_重启_08

脚本执行结果


重启后,会有提示是否要真的禁用此特性。按 ​​Windows​​键或者 ​​F3​​ 键禁用,按​​Esc​​ 跳过。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_重启_09

禁用 Device/Credential Guard


顺利安装完系统过后,我们就可以开始进行双机内核调试了。


通过虚拟串口方式连接

如果我们希望通过虚拟串口的形式连接,我们在系统设置前,一定要注意: ​​VMware​​ 中的打印机会占用默认的 ​​串口 1​​。如果不移除打印机,我们新建的串口会是 ​​串口 2​​(这样,我们在被调试系统中设置的时候,需要设定​​debugport​​ 的值为 ​​2​​)。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_内核调试_10

新建串口2 并设置参数


当然,我们可以移除打印机,然后新建串口,这样新建的串口就是默认的 ​​串口 1​​ 了。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_重启_11

移除 VMware 中的打印机


我以保留打印机,使用 ​​COM2​​ 为例,录制了一份屏幕录像。这里对整个操作过程做一个简要描述:


  • 新建串口,因为打印机占用了 ​​串口 1​​,所以我们新建的串口是 ​​串口 2​​。
  • 设置 ​​pipe​​ 参数,我设置的是 ​​\\.\pipe\bcn_com​​,其他参数默认即可。
  • 启动虚拟机系统,设置调试参数,命令如下:
    ​bcdedit /debug on bcdedit /dbgsettings serial debugport:1 baudrate:115200​
  • 以管理员权限运行 ​​windbg​​,通过界面连接。
    使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_串口_12
  • 重启虚拟机系统,发现连接不上。因为我们新建的串口是 ​​串口 2​​,而我们在虚拟机系统里设置的是 ​​串口 1​​。
  • 重启虚拟机系统,设置调试参数,命令如下:
    ​bcdedit /debug on bcdedit /dbgsettings serial debugport:2 baudrate:115200​
  • 重启虚拟机系统,这次成功连接上了。
  • 最后,还演示了 ​​windbg​​ 通过命令行直接连接。命令行如下:
    ​windbg.exe -k com:pipe,port=\\.\pipe\bcn_com,reconnect​



通过 VirtualKD

经常做双机内核调试的小伙伴儿一定对 ​​VirtualKD​​​ 不陌生。可以大大提高双机内核调试的速度,可谓神器。几年前,用 ​​VirtualKD​​​ 搭建双机内核调试环境很简单。没想到这次居然各种连接不上。通过 ​​google​​​ 搜索关键字 ​​VMware15 VirtualKD​​​,在 ​VirtualKD github issues​  看到已经有小伙伴儿遇到这个问题了。应该是 ​​VirtualKD3.0​​​ 与 ​​VMware15.5​​​ 不兼容。真是个坏消息,不过也有好消息 —— 已经有大佬解决了这个问题,​​github​​​ 上对应的仓库是 ​VirtualKD-Redux​。在查找解决方案的过程,发现有人遇到另外一个问题。在虚拟机里执行 ​​bcdedit /debug on​​ 失败,提示值被保护,如下图:


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_重启_13



可以在 ​​虚拟机设置​​ 的 ​​高级​​ 选项里,禁用 ​​安全引导​​。


使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_内核调试_14

disable-security-boot


​VirutalKD-Redux​​ 的使用方法和 ​​VirutalKD​​ 一样,简要步骤如下:


  1. 在调试主机端运行 vmmon64.exe
    ,点击 Debugger Path...
    选择调试器路径。
  2. 把 target64
    拷贝到虚拟机中(如果是 32
    位系统,请拷贝 target32
    )。
  3. 在虚拟机中执行 target64
    目录下的 vminstall.exe
    安装 VirtualKD-Redux
  4. 重启虚拟机系统,选择新建立的 Entry
    ,并且按 F8
    选择禁用强制签名。
  5. 如果顺利,调试器会自动弹出并连接到被调试系统(因为 Start debugger automatically
    默认是勾选状态)。
  6. 如果调试器没自动弹出,或者我们意外的关闭了调试器,我们可以通过点击 Run Debugger
    按钮,手动启动调试器。

整个过程,非常简单。具体过程录屏如下:

使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境_内核调试_15



windbg 符号路径设置

当我们执行一些命令的时候(比如,​​!thread​​),需要符号文件的帮助。我们可以通过 ​​_NT_SYMBOL_PATH​​ 环境变量设置符号路径。如果还没有设置,可以在 ​​windbg​​ 中执行 ​​.symfix path/to/symbol_cache​​ 自动设置微软符号服务器为上游符号服务器。当需要符号时,​​windbg​​ 会先到 ​​path/to/symbol_cache​​ 中查找符号,如果找不到,会继续到微软符号服务器上查找,如果在微软符号服务器上找到了,会缓存到 ​​path/to/symbol_cache​​,然后从 ​​path/to/symbol_cache​​ 加载符号。


温馨提示:


  • .symfix
    命令会删除 windbg
    中现有的符号路径设置。
  • 目前,好像需要ke xue上网才能成功连接微软符号服务器。



总结


  • 使用 ​​VMware​​ 前,最好禁用 ​​Hyper-V​​,禁用 ​​Security Boot​​,开启 ​​Intel VT-x​​。
  • 一定要注意,​​VMware​​ 默认带的打印机会占用 ​​串口 1​​,如果不删除打印机就新建串口的话,新建的串口是 ​​串口 2​​。
  • ​VirtualKD3.0​​ 还不支持 ​​VMware15.5​​,我们可以使用 ​​VirtualKD-Redux​​。
  • 执行 ​​.symfix path/to/symbol_cache​​ 使用微软符号服务器。