前言
当我们没有两台物理机时,又想做双机内核调试怎么办?当然是装虚拟机啦!本文总结了使用 VMware15.5 + win10 + virtualkd + windbg
搭建双机内核调试环境。
安装环境
VMware
版本:15.5 pro
。可以到 VMware 官网下载地址 下载最新版本。- 我的物理主机系统:
win10 1909
。其它版本的windows
也可以,VMware15.5
最低支持win7
系统。 - 虚拟机系统镜像:
win10 1809 x64
。其它版本的系统也可以。我们可以在 msdn i tell you 上面找到各个版本的windows
官方镜像。除了系统镜像,还包括其它很多工具的官方镜像,比如vs
,office
等。
windbg
版本:10.0.18362.1
,其它版本的也可以。windbg
包含在windows sdk
中。可以到微软官网 SDK 下载地址 下载。如果只需要windbg
,推荐下载.exe
形式的安装包。在安装的时候,可以只勾选Debugging Tools for Windows
。
安装 VMware
& 安装 win10
下载 VMware
到本地后,直接双击即可安装,一路点击 下一步
即可。需要注意以下两点:
- 尽量下载最新版本的
VMware
,早期版本的VMware
在win10 1909
上可能有兼容性问题。 - 安装完成后,最好重启系统!
安装好 VMware
后,就可以安装系统镜像了。通过 文件(F) -> 新建虚拟机(N)
即可开始 新建虚拟机向导
。一般我们通过 安装程序光盘映像文件(iso)(M)
的形式选择下载好的系统镜像安装,然后一路 下一步(N)
即可。
安装完成后,可以启动了。但是可能遇到一些问题,我做了简单的总结。
可能遇到的问题
- 提示
Intel VT-x
被禁用。
根据提示,在 BIOS
里开启 Intel VT-x
。
重启进入BIOS
,打开 Intel Virutal Technology
,按 F10
保存退出。
- 提示
VMware Workstation
与Device/Credential Guard
不兼容。
强烈建议先检查下 Hyper-V
是否开启,如果开启了,请先关闭 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
表示自动重启系统,根据自己的需要指定。
重启后,会有提示是否要真的禁用此特性。按 Windows
键或者 F3
键禁用,按Esc
跳过。
顺利安装完系统过后,我们就可以开始进行双机内核调试了。
通过虚拟串口方式连接
如果我们希望通过虚拟串口的形式连接,我们在系统设置前,一定要注意: VMware
中的打印机会占用默认的 串口 1
。如果不移除打印机,我们新建的串口会是 串口 2
(这样,我们在被调试系统中设置的时候,需要设定debugport
的值为 2
)。
当然,我们可以移除打印机,然后新建串口,这样新建的串口就是默认的 串口 1
了。
我以保留打印机,使用 COM2
为例,录制了一份屏幕录像。这里对整个操作过程做一个简要描述:
- 新建串口,因为打印机占用了
串口 1
,所以我们新建的串口是串口 2
。 - 设置
pipe
参数,我设置的是\\.\pipe\bcn_com
,其他参数默认即可。 启动虚拟机系统,设置调试参数,命令如下:
bcdedit /debug on bcdedit /dbgsettings serial debugport:1 baudrate:115200
- 以管理员权限运行
windbg
,通过界面连接。 - 重启虚拟机系统,发现连接不上。因为我们新建的串口是
串口 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
失败,提示值被保护,如下图:
可以在 虚拟机设置
的 高级
选项里,禁用 安全引导
。
VirutalKD-Redux
的使用方法和 VirutalKD
一样,简要步骤如下:
- 在调试主机端运行
vmmon64.exe
,点击Debugger Path...
选择调试器路径。 - 把
target64
拷贝到虚拟机中(如果是32
位系统,请拷贝target32
)。 - 在虚拟机中执行
target64
目录下的vminstall.exe
安装VirtualKD-Redux
。 - 重启虚拟机系统,选择新建立的
Entry
,并且按F8
选择禁用强制签名。 - 如果顺利,调试器会自动弹出并连接到被调试系统(因为
Start debugger automatically
默认是勾选状态)。 - 如果调试器没自动弹出,或者我们意外的关闭了调试器,我们可以通过点击
Run Debugger
按钮,手动启动调试器。
整个过程,非常简单。具体过程录屏如下:
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
中现有的符号路径设置。- 目前,好像需要科学上网才能成功连接微软符号服务器。
总结
- 使用
VMware
前,最好禁用Hyper-V
,禁用Security Boot
,开启Intel VT-x
。 - 一定要注意,
VMware
默认带的打印机会占用串口 1
,如果不删除打印机就新建串口的话,新建的串口是串口 2
。 VirtualKD3.0
还不支持VMware15.5
,我们可以使用VirtualKD-Redux
。- 执行
.symfix path/to/symbol_cache
使用微软符号服务器。
参考资料
VirtualKD official install tutorial
[Setting up kernel debugging (VirtualKD)]