使用WinDbg和虚拟机调试Windows驱动程序教程(转)

驱动调试攻略 (WinDbg)
驱动调试是一个系统级调试方式,所以调试工具用 WinDbg 是最佳选择。驱动调试一般情况下,需要两台电脑进行。一台作为主机进行驱动调试,另一台作为目标机进行驱动安装。当然如果没有多余的电脑,我们可以安装 VMware 模拟系统调试(虚拟机)。只是对电脑的配置要求比较高。本文介绍使用 WinDbg VMware 进行调试的具体设置及方法。这些资料在网络很难找到,笔者也是吸取了他人很多宝贵意见才完成的,供大家学习讨论。其实用SoftIce可以单机调试驱动,但是有个问题就是在SoftIce启动前驱动可能已经启动了。
VMware Support 中说,自 4.0.18.0 版本之后的 WinDbg 都支持了通过 pipe 来进行调试,不过 微软 对此并没有任何说明。所以,在 VMware 中虚拟被调试的系统,然后通过 VMware 虚拟一个 com 端口。使用这个虚拟的端口,就可以用 WinDbg 进行调试了。
具体步骤如下:

1. 安装和设置WinDbgVMware

首先,请到微软官方网站
http://www.microsoft.com/whdc/devtools/debugging/default.mspx ,下载最新版本的 WinDbg 工具,建议使用 6.0 以上版本的 WinDbg 做为调试工具。 VMware 也可以在网站上找到,当然使用高版本比较好。 安装过程比较简单,就不在此多做介绍。唯一要注意的是,安装完虚拟机后,请在 VMware 主菜单 “VM” 中选择 “Install VM Tools…” ,完成系统驱动文件的安装。
安装完这两个软件后,请在 VMware 中安装跟你的电脑版本相同的操作系统。例如:你的电脑安装的是 WindowsXP Professional, 那么最好在 Vmware 中安装相同版本。至少是相同的系统, Windows XPßà Windows XP Windows 2000ßà Windows 2000 。这样会在驱动调试过程中避免不必要的麻烦。笔者使用的操作系统为 Windows XP Professional
我们将使用电脑的 COM1 口最为调试口。

1.1设置 VMware 的虚拟com

1.     运行 VMware ,点击 "Edit virtual machine settings"
2.     点击 "Add..." 来运行 VMware Hardware Wizard  
3.     选择 "Serial Port" ,点 " 下一步 "
4.     选择 "Output to named pipe", " 下一步 "
5.     第一框里保持默认的 "\\.\pipe\com_1"
第二框里选 "This end is the server."
第三框里选 "The other end is an application."
选中 "Connect at power on"
然后点击 "Advanced>>"
6.     选中 "Yield CPU on poll" VMware Support 中提到了这一点),然后点完成。
7.     这样就完成了虚拟 com 的设置。
8.     重新启动一下。

1.2设置 VMware 虚拟出来的 guest os

9.     编辑虚拟机中 C 盘根目录下的 boot.ini 文件。
c:\ 下,可以找到 boot.ini ,可以用记事本打开它,或者命令行方式
C:\>attrib -s -h -r boot.ini
C:\>notepad boot.ini
我们需要在 guest os 的启动项上加些参数,才能够使用 WinDbg 调试它。我们可以在现有的行后面直接加参数,不过强烈推荐复制一个新行,在新行的后面加参数。这样在调试启动有问题的时候,我们可以方便的换回原来的启动方式。下面就是我改好的 boot.ini
boot.ini 文件中添加以下代码:
multi(0) disk(0) rdisk(0) partition(1) \WINDOWS="Microsoft Windows XP Professional-Debug" /fastdetect /debugport=COM1 /baudrate=115200
10.  guest os 的设备管理器中把 com1 端口的速度也就是 " 每秒位数 " 项,设为和上面一样的 115200
打开 vmware winxp 的设备管理器,选择端口( com1 ), 双击这个 "com1", 在弹出的对话框中。

1.3设置真实系统(主机)com

11.  回到我们的真实系统(主机)中,重复第 10 步。

1.4设置真实系统(主机)WinDbg

12.  设置 WinDbg 的快捷方式,及其运行参数:
我们需要告诉 WinDbg 通过 pipe 进行连接和连接的速度。
可以在命令提示符( cmd.exe )下加参数 -k com:port=\\.\pipe\com_1,baud=11520,pipe 运行 WinDbg VMware Support 中没有提到 baud=11520 这个参数,其实这是个比较重要的参数)。
更方便的方法是在桌面建立一个 WinDbg 的快捷方式,在该快捷方式的属性, " 目标 " 框中,加上参数 -k com:port=\\.\pipe\com_1,baud=11520,pipe 。这样运行这个快捷方式启动的 WinDbg 就完成了设置。参数的具体作用,可以参考 WinDbg 的帮助文件。
  在快捷方式的属性中,将目标( Target )改为:
"C:\Program Files\Debugging Tools for Windows\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,resets=0
命令参数的意义:
-b
:一旦主机目标机之间建立起连接,立刻中断目标机
-k
:内核调试
Com
:设置连接目标机的通信端口(此处为命名管道)和波特率(此处为 115200
-y
:设置符号文件路径
13.  设置 WinDbg 参数
  现在我们假设你的驱动代码放在 D:\mydriver 目录中;系统级 Symbol 文件存放在 C:\WINDOWS\Symbols 目录中,这些 Symbol 文件是从微软的网站上 http://msdl.microsoft.com/download/symbols 下载而来,这个网址是不可以用 IE 直接打开的, WinDbgà Fileà Symbol File Path... 界面中选择 Reload WinDbg 会自动帮你下载;驱动生成的 Symbol 文件存放在 D:\mydriver\objchk_wxp_x86\i386 目录中。
a)     设置驱动 Symbol 路径, WinDbg->File-> Symbol File Path...
SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols; D:\mydriver\objchk_wxp_x86\i386
b)     设置驱动源文件路径, WinDbg->File-> Source File Path… D:\mydriver
c)     为了保险起见,我们同时设置系统变量。
My Computer -> Properties-> Advanced Tab-> Enviroment Variables->
Add._NT_DEBUG_BAUD_RATE=115200
_NT_SYMBOL_PATH=SRV*C:\WINDOWS\Symbols* http://msdl.microsoft.com/download/symbols
_NT_ALT_SYMBOL_PATH = D:\mydriver\objchk_wxp_x86\i386
_NT_SOURCE_PATH = D:\mydriver
14.  启动 VMware, 将主机目录 C:\WINDOWS\Symbols 下的拷贝到虚拟机的相同位置。同时请把驱动编译后生成在 D:\mydriver\objchk_wxp_x86\i386 目录下的 *.pdb *.sys *.map *.exp *.lib 文件一并拷贝到两个系统的 C:\WINDOWS\Symbols 目录中。
15.  重新启动 VMware ,并选择如图所示。这个时候先不敲回车键。
16.  在主机中运行之前设置好的 WinDbg 快捷方式。直到在 WinDbg 命令窗口中出现 “Waiting to reconnect...” ,此时打开 VMware ,敲回车键进入虚拟机。到这里所有的设置工作就全部完成了。

2.驱动安装及调试

这里其大家注意,由于我们目前用的是虚拟机,所以安装驱动程序的时候一定要把 VMware 设置到全屏状态。
17.  编辑你要调试的源代码,在你需要调试的代码中添加硬断点。如果不添加硬断点,将没有办法进入所调试的程序中。具体方法如下:
在你需要调试的程序中加入以下代码:
extern "C" {
#include <wdm.h>
// 或者是 #include <winddk.h>
}// 放在文件开头
DbgBreakPoint();// 放在需要调试的地方
重新编译驱动程序,记住一定要更新把重新生成的 *.pdb *.sys *.map *.exp *.lib 文件一并拷贝到两个系统的 C:\WINDOWS\Symbols 目录中。
18.  打开 VMware,Ctrl+Alt+Enter 进入虚拟机全屏模式。插入需要调试设备的硬件,笔者调试的目标设备为 USB 。当 USB 插入主机后,直接由 VMware 识别到这个 USB 设备,指定驱动位置,系统将会在你设置硬断点的地方停下来。这个时候你就可以回到 WinDbg ,进行单步调试了。你还可以在程序中添加软断点, “F9” 或者 “bp MyApp!MyFunction”

3.两台电脑调试说明

两台电脑调试跟借助 VMware 调试有所不同,不同之处有以下几个方面。
1        需要自己制作一条 Null Modem Cable. 请参考以下电路。将两台电脑连接起来。
管脚信息说明:  
9-Pin NULL Modem Cabling
3 2 Transmit Data
2 3 Receive Data
7 8 Request to Send
8 7 Clear to Send
6,1 4 Data Set Ready and Carrier Detect
5 5 Signal Ground
4 6,1 Data Terminal Ready
 
25-Pin NULL Modem Cabling
2 3 Transmit Data
3 2 Receive Data
4 5 Request to Send
5 4 Clear to Send
6 20 Data Set Ready and Carrier Detect
7 7 Signal Ground
20 6 Data Terminal Ready  
2 WinDbg 快捷方式参数设置
"C:\Program Files\Debugging Tools for Windows\windbg.exe" -b -k com:port=\\.\ com1,resets=0

你可能感兴趣的:(职场,休闲)