VirtualKD + VMWare实现单机内核调试
By 张佩
若干年以前,我的前同事酒若v霖(JIURL)写的《借助VMware实现单机使用WinDbg》一文,帮助了很多人,至今流传甚广。它介绍了如何借助于VMWare虚拟机,在同一台电脑上使用Windbg调试软件,实现内核“双机”调试。这种技术,使用命名管道对物理串口进行模拟,让虚拟机系统感觉自己是通过物理串口,在和主机通信。下图是它的实现原理:
图1虚拟机串口调试原理
笔者一度也用过串口进行双机调试,感觉就是一个字:慢!串口的传输速度称为波特率。在当前语境下,可以把波特率等同于比特率。我发现,系统能够支持的最大串口波特率,是115200。这个数字看上去就不大,换算一下大概是14400字节/秒,或者14K/秒。另一种双机连接方式,1394连接,它平均传输速度能达到10M/秒。二者一相比较,有若干个数量级之差。
读者可能会提一个问题:用命名管道模拟的串口,也必须受制于波特率吗?
命名管道,而且是本机传输,其速度一定是非常快的。但图1中,在虚拟机系统里面,我们看到有一个“串口内核调试模块(KDCOM)”,它会对波特率进行判断。发觉波特率不匹配的情况下,数据将被抛弃。所以命名管道是“被迫”降速!
如果能把串口内核调试模块换掉的话,就好了!本文介绍的VirtualKD软件,就是这样实现的一个产品。下面详细介绍。
请从此地址下载最新的VirtualKD安装包:http://virtualkd.sysprogs.org/
作为一款免费软件,做得如此好。有闲的朋友在没事的时候,可以考虑给他们捐一点银两。如果大多数人都能习惯于慷十元之慨(尤其在中国),自由软件和开源软件的状况,会很不一样。谢谢。
下载后安装(其实是解压),打开安装目录,看到有一个名为Target的文件夹。请在此时打开你要调试的目标虚拟机系统,把Target文件夹拷贝过去,运行此文件夹里面的VMInstall.exe程序。这个程序的运行界面如图2所示。
图2添加启动项
程序VMInstall做了两件事,先说其一:添加启动项。
这个程序很智能,可以发现你的当前系统平台,新建一个启动项,并起一个描述名。如果没有异议,直接点Install即可。安装完成后,我们最好打开系统配置程序查看一下:
图3确认新增启动项
如果是XP及以前的系统,可以打开C:/boot.ini文件查看其启动项的完整设置。应该是类似下面的内容:
multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Windows XP [VirtualKD]" /DEBUG /DEBUGPORT=vm /fastdetect /NoExecute=OptIn请务必注意到粗体部分内容:/debugport=VM。它的调试端口是“VM”。这个调试端口系统肯定不承认,是VirtualKD自定义的。嵌入到VMWare软件中的相关模块,通过它来判断它是不是一个需要由自己来处理的系统。
如果是Vista及以后的系统,应该用BcdEdit命令来查看新启动项。应该看到类似下面的内容:
Windows 启动加载器 ------------------- 标识符 {default} device partition=E: path /Windows/system32/winload.exe description Windows 7 [VirtualKD] recoveryenabled Yes testsigning Yes osdevice partition=E: systemroot /Windows dbgtransport kdvm.dll resumeobject {331ebcfd-736a-11de-a22b-8e8ebafcd1d7} nx OptIn custom:26000027 Yes debug Yes这里面有两项是比较特殊的: testSigning 和 dbgtransport 。前者标记系统中有未签名的驱动,让系统正常加载,在64位系统上所有的驱动都必须通过数字签名,否则拒绝加载,本软件包中的驱动文件显然没有这样做;后者则是一个用来替代图 1中串口模块的内核调试模块(KDCOM.dll),这个模块显然可以自定义,第三方可以用自己的类似模块替代它。
不管是什么系统,这些陌生的启动项,都自己添加了一些莫名其妙的选项值,是VirtulKD系统独有的,而正常系统不可识别。所以不可以在自己的主机上添加这样的启动项,笔者好事试过,结果是通过这些启动项,无法进入系统。
回头再说VMInstall做的第二件事。它把一个名为DDKLaunchMonitor.exe的程序释放到系统根目录下,并把它设置为系统启动程序。它在注册表键HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Run中添加一个DDKLaunchMonitor值来实现开机启动。这个程序运行界面如图4所示,图中的文字信息很清楚地表明,它正在干什么——监控来自主机的连接请求。
图4目标机运行DDKLaunchMonitor程序监控调试连接
安装好DDKLaunchMonitor后,会提示系统重启,请按要求重启。重启的时候,默认以新建的启动项进入系统,亦请照办。
现在让我们回到主机端,仍打开安装目录,看到名为VMMon.exe和VMMon64.exe的程序。前者用于32位系统,后者用于64位系统。运行它,软件界面如下:
图5主机端监控
此程序的作用是在主机端监控VMWare中运行的虚拟机系统。图5上半部分,它监控到了一个系统。它非常可心地,把所监控到的VMWare进程、系统CPU占用率等详细信息都列了出来。
此时选中要调试的目标系统,在右下角点击Run Debugger按钮,启动内核调试器。如果你是首次运行,需要先点击此按钮左边一点的Debugger Path…按钮,以设置调试器路径。默认受支持的调试器有Windbg和KD两种,还可以用Custom选项设置自定义调试器。本文默认用Windbg调试器。不出意外,我们会看到Windbg自动开启,并跳出下面的界面:
图6 Windbg开始调试
从提示信息看出,Windbg已经打开了命名管道。此时按下CTRL+Break组合键,就能建立连接了。速度会非常快哦!
开发VirtualKD的同一个组织,还开发了一款名叫VisualDDK的产品。后者把VirtualKD包含在内,又添加了一个新功能。这个新功能也非常炫,它通过插件形式,为Visual Studio添加一个项目向导,通过这个项目向导,能新建一个WDM工程,并为这个新建的WDM工程自动添加百余行代码,这些代码非常干净,笔者很喜欢。
在DriverStudio停止维护五六年之后的今天,仍有很多人痴迷地偏爱、使用DriverStudio来生成驱动工程(特别是USB驱动),危险啊危险。VisualDDK虽然很轻量,其实是个另一个好选择。