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

驱动调试攻略(WinDbg)

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

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

具体步骤如下:

1. 安装和设置WinDbgWMware

首先,请到微软官方网站

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 XPWindows 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

打开vmwarewinxp的设备管理器,选择端口(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 运行WinDbgVMware 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...界面中选择ReloadWinDbg会自动帮你下载;驱动生成的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  

2WinDbg快捷方式参数设置

"C:\Program Files\Debugging Tools for Windows\windbg.exe" -b -k com:port=\\.\ com1,resets=0

原文地址:https://www.cnblogs.com/rainbowzc/p/1697146.html