现在的位置: 首页 > windows驱动开发 > 正文
用虚拟机VMWare+WinDbg调试Windows驱动攻略
2012年10月23日 windows驱动开发 ⁄ 共 4560字 暂无评论 ⁄ 被围观 1,529 views+
扫描仪打印机USB驱动程序开发外包

Windows驱动调试攻略(WinDbg)

驱动调试是一个系统级调试方式,所以调试工具用WinDbg是最佳选择。驱动调试一般情况下,需要两台电脑进行。一台作为主机进行驱动调试,另一台作为目标机进行驱动安装。当然如果没有多余的电脑,我们可以安装VMware模拟系统调试(虚拟机)。只是对电脑的配置要求比较高。本文介绍使用WinDbg及WMware进行调试的具体设置及方法。这些资料在网络很难找到,笔者也是吸取了他人很多宝贵意见才完成的,供大家学习讨论。

VMware Support 中说,自 4.0.18.0 版本之后的 WinDbg 都支持了通过 pipe 来进行调试,不过微软对此并没有任何说明。所以,在VMware中虚拟被调试的系统,然后通过VMware虚拟一个com端口。使用这个虚拟的端口,就可以用 WinDbg 进行调试了。

具体安装设置步骤如下:

1. 安装和设置WinDbg,WMware

首先,请到微软官方网站

http://www.microsoft.com/whdc/devtools/debugging/default.mspx,下载最新版本的WinDbg工具,建议使用6.0以上版本的WinDbg做为调试工具。WMware也可以在网站上找到,当然使用高版本比较好。 安装过程比较简单,就不在此多做介绍。唯一要注意的是,安装完虚拟机后,请在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

 

本文聚合自:

  • http://blog.163.com/zhg_tao
  • http://www.cnblogs.com/suiyingjie/
  • http://blog.163.com/zhg_tao/blog/static/84116744200862424215/
  • http://www.cnblogs.com/suiyingjie/archive/2008/01/25/1053391.html
  • http://silverstr.ufies.org/lotr0/windbg-vmware.html
  • http://www.vmware.com/support/ws3/doc/ws32_devices3.html




扫描仪打印机USB驱动程序开发外包

给我留言

您必须 [ 登录 ] 才能发表留言!

最活跃的读者

网站统计

    日志:69篇
    评论:0条
    分类:7个
    标签:150个
    链接:3个
    网站运行:3642天
最后更新:2017年8月3日
×