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