您的位置:首页 > 其它

利用WinDbg+Virtual PC调试驱动程序

2011-08-16 20:41 197 查看
最近在看《Windows驱动开发技术详解》一书,就想搭建一个Windows驱动程序的源码级调试环境。采用的软件主要是WinDbg和Virtual PC 2007,两者都是微软自家的东西,配合起来也相当默契。之前也曾用vmware装了一个Win XP SP3,但由于我的电脑配置一般,跑起来非常卡,更要命的是找不到 Vmware Tools,也就没办法和宿主机建立文件共享,遂放弃了vmware。

我的宿主机和虚拟机操作系统使用的是同一个版本——Windows XP SP3,关于操作系统的安装方法就不再赘述。下面主要说明一下WinDbg和Virtual PC 2007的安装与配置。

1. 安装并配置WinDbg

首先从MSDN下载Windows Driver Kit (目前WinDbg已集成在Windows Driver Kit中),并将符号文件一并下载。安装比较简单,直接运行安装程序即可。注意勾选Debugging Tools for Windows一项。安装完成后,在”开始菜单->所有程序”中,就能看到” Debugging Tools for Windows”了。

启动WinDbg,它的初始界面如下所示:



WinDbg包含了许多窗口,如反汇编窗口、命令窗口、内存窗口、寄存器窗口等。它的窗口布局也是比较灵活的。网上已经有经过精心布局的工作区间文件供下载使用,但作为一个新手,还是应该自己动手练习一下窗口布局方法。我的窗口布局如下图所示:



在练习的过程中,发现它还是比较折腾人的。我想把反汇编窗口和内存窗口做为标签页叠放在一起放在左上角,具体方法在帮助文档中有说明。首先要把这两个窗口的属性都设为”Dock”,然后就是用鼠标拖动一个窗口至另一个窗口,被拖动的窗口会有一个阴影的,当这个阴影与目标窗口重合时,松开鼠标,这两个窗口就可以组合为标签页了。接下来在摆放命令窗口和寄存器窗口时,却怎么也做不好。折腾了半天,发现”Windows”菜单下有个”Dock All”选项,于是我把已有的窗口都关闭,再依次打开反汇编窗口、命令窗口、内存窗口和寄存器窗口(注意不要让它们重合了),然后点击”Dock
All”命令,这些窗口就会自行停靠。接下来要做的,就是像玩拼图游戏一样,用鼠标拖动各个窗口至适当的位置,就可以达到上图的效果。

2. 在虚拟机中安装待调试的驱动程序

驱动程序可以直接安装在宿主机上,但没人会这么做的。万一驱动有问题,让系统蓝屏了怎么办,这个时候,就显示出虚拟机的好了。可以事先将虚拟机的硬盘文件做个备份,然后就能对虚拟机随便折腾了,装驱动也不在话下。这里安装的驱动程序是《Windows驱动开发技术详解》附带的HelloWDM,具体安装方法,请参阅此书。

3. 为虚拟机配置虚拟串口

WinDbg被安装在了宿主机中,而驱动程序则是在虚拟机(客户机)中,如何让WinDbg与被调试的驱动程序HelloWDM进行通信呢?我们先要为虚拟机配置一个虚拟串口。在Virtual PC Console中,点击”Settings”打开虚拟机的属性对话框,选中COM1,如下图所示:



在右侧的属性配置中,选择”Named Pipe”,并填写\\.\pipe\com_1,然后点击”OK”,就完成了虚拟串口的设置。

4. 在虚拟机启动画面中增加Debug项

调试驱动程序时,一定要牢记一点:驱动是运行于内核态的,当你看到Win XP的“蓝天草原”时,你已经处于用户态了。调试驱动本质上就是在调试内核,因此要想办法使WinDbg在虚拟机尚处于内核态时就把它中断下来。这可以通过修改虚拟机的Boot.ini文件来完成。具体地,用记事本打开Boot.ini,添加下面一行:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /noexecute=optout /fastdetect /debug /debugport=com1 /baudrate=115200

这样的话,当虚拟机启动时,就能看到Debug项了,如下图所示:



5. 创建专门的WinDbg快捷方式

虚拟机和驱动程序都配置好了,我们可以运行WinDbg,然后选择”File”菜单的”Connect to Remote Session”,然后在弹出对话框中输入相应的连接字符串。这种方式较为繁琐,实际上可以建立一个专门的WinDbg快捷方式,修改它的目标属性为:

D:\WinDDK\7600.16385.1\Debuggers\windbg.exe -y D:\WINDOWS\symbols;E:\Project\windows\objchk_wxp_x86\i386;srv*D:\WINDOWS\symbols*http://msdl.microsoft.com/download/symbols -b -k com:pipe,port=\\.\pipe\com_1,resets=0

如下图所示:



在此我们用了如下几个命令行选项:

-y :指定符号表搜索路径。注意一定要将驱动程序HelloWDM的符号路径添加进去。我的为E:\Project\windows\objchk_wxp_x86\i386(多个路径用;分割)

-b :(仅适用于内核模式)这个选项有两个作用:1). 调试器与目标机建立连接后会立即中断;2). 目标机在重启且完成内核的初始化后,调试器将目标机中断。

-k :(仅适用于内核模式)开启一个内核调试会话,并指定连接类型。

6. 开始源码级调试

终于可以进行源码级调试了。何为源码级调试?就是能够在用C/C++等高级语言写的源文件中下断点,并做单步执行等调试操作。

首先启动虚拟机,在开机画面中选择Debug项,紧接着双击WinDbg快捷方式,若一切正常的话,将能看到如下画面:



从红框部分可以看到,WinDbg已经与虚拟机建立了连接,并将其中断在内核态。

既然是源码级的调试,那源代码在哪里呢?我们通过”File”菜单的”Open Source File…”菜单项打开驱动程序的源文件,然后重新调整WinDbg的窗口布局如下:



其中红框部分即为源代码窗口。

接下来就可以设置断点,单步执行程序了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: