使用WinDbg进行Windows内核调试通常需要两台计算机,一台是Debuggee,一台作为Debugger,又成为Host。使用Virtual PC可以在同一台电脑上进行内核调试,对于某些调试任务来说还是非常有用的。
下面以Virtual PC 2004为例,介绍一下利用Virtual PC进行Windows内核调试的详细过程。
1,下载并安装Virtual PC 2004,从略。
2,启动Virutal PC Console(控制台),创建一台新的虚拟PC,安装向导的提示配置硬盘、内存等参数。
3,在刚才创建的虚拟PC上安装操作系统,这个操作系统应该是你要调试的Windows版本。比如你想调试你的驱动程序在Windows Server 2003上出现的问题,那么就安装Windows Server 2003。我们以Windows 2000为例。
4,配置虚拟PC的串行口,在Virtual PC的控制台中选择Windows 2000,然后点击Settings按钮弹出设置对话框,然后在左侧的列表中(如下图)选择COM1。
右侧选择Named Pipe选项,即使用命名管道来模拟串行口,然后输入管道的完整名称:\\.\pipe\com_1,com_1可以为其它名称,但是前面的部分应该保持不变。
5,启动虚拟PC中的Windows 2000,然后进入命令行窗口,执行如下命令以便在启动菜单中增加调试选项:
c:
cd\
attrib -r -h
edit boot.ini
然后将其最末一行复制,并加入调试选项,成为为如下状态:
6,在虚拟PC中选择重新启动Windows 2000,当出现启动菜单时,按方向键使其停止自动计时,等待在这里。
7,在主机(debugger)上准备启动WinDbg,考虑每次输入命令行参数太麻烦,所以建议建立一个如下内容的批处理文件,并将其放到与WinDbg.exe同位置的目录中。
windbg -k com:pipe,port=\\.\pipe\com_1
8,运行批处理文件,使其也进入等待状态:
9,切换到虚拟PC窗口,选择带有“Debug Enabled”的一项然后回车启动。
10,切换到WinDbg窗口并观察,如果一切顺利,那么会有如下类似信息输出:
Connected to Windows 2000 2195 x86 compatible target, ptr64 FALSE
Kernel Debugger connection established.
Symbol search path is: SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows 2000 Kernel Version 2195 UP Free x86 compatible
Kernel base = 0x80400000 PsLoadedModuleList = 0x8046a4c0
System Uptime: not available
11,见到如上信息就说明WinDbg已经与虚拟PC中运行的Windows 2000成功建立调试对话了。如果想感受一下将Windows控制于股掌之中的快感,那么就按下Ctrl+Break,随着按键发出,Windows 2000会被立刻定住。WinDbg中会显示如下信息:
*******************************************************************************
* *
* You are seeing this message because you pressed either *
* CTRL+C (if you run kd.exe) or, *
* CTRL+BREAK (if you run WinDBG), *
* on your debugger machine's keyboard. *
* *
* THIS IS NOT A BUG OR A SYSTEM CRASH *
* *
* If you did not intend to break into the debugger, press the "g" key, then *
* press the "Enter" key now. This message might immediately reappear. If it *
* does, press "g" and "Enter" again. *
* *
*******************************************************************************
此时WinDbg的命令提示符区会显示一段时间*BUSY*(或者其它无效状态,老本本的WinDbg),这是因为WinDbg在寻找调试符号。
在你非常熟悉以上过程之后,其实可以不完全拘泥以上过程的, 比如可以先让Windows 2000以调试选项运行起来,然后再运行WinDbg。
最后再介绍几种常见的失败情况:
1)启动WinDbg,但是出现下图所示的错误信息,Win32 error 2,即指定的文件名找不到,这是因为虚拟PC还没有启动,还没有创建这个管道\\.\pipe\com_1, 系统中不存在这样的文件。应该运行虚拟PC,哪怕只到启动选项也可以,便不会再有这个错误了。