Windbg+vmware 搭建联机调试环境
开发windows驱动程序的过程中,调试程序成了一个大问题,如果在自己本机上运行驱动程序,如果程序有误,会直接蓝屏,甚至会严重损坏系统,所以需要联机调试,如果没有两台机器的话,利用vmware来搭建调试和测试环境是一个非常好的选择。下面就介绍如果利用windbg和vmware来搭建驱动的调试和测试环境。
一.需要的软件和环境
1.宿主机为windows7 64位
2.Vmware-workstation 10
可以在网上下载到,只要找到一个通用的序列号,也并非难事。
3.虚拟机:windows xp 专业版32位
目前可以在网上直接下载到各种windows版本的虚拟机镜像文件,下载后只需要解压,利用wmware打开即可以使用,而省去了自己安装虚拟机系统的麻烦。可以在这个网址
http://cbmland.com/post/329/vmware-vmdk-images-shared.html
找到并下载所使用的虚拟机镜像文件,
4.windbg
下载地址 这是windows的御用调试工具,可以用来调试应用程序,也可以用来调试内核代码。这里我们用它来调试windows驱动程序。
二.利用串口来搭建测试环境
1.为虚拟机增加串口设备
编辑虚拟机设置 > 添加 > 选择 串行端口 ,下一步 > 选择 输出到命名管道,下一步 > 命名管道名采用默认的名称就行,设置该端为服务器,另一端为应用程序,勾选 启动时连接,完成。
添加完成串口设备后,可以看到增加了一个串口设备,注意 使用的命名管道为\\.\pipe\com_1,这是默认的名称,最好不要改,当然也可以改成自定义 \\.\pipe\<comname>
注意:由于有打印机,打印服务占用了一个串口,新添加的这个串口是串行端口2(COM2)
启动虚拟机,打开设备管理器(开始 > 计算机 右键,选择 管理 > 设备管理器 ,找到通讯端口com2, 右键菜单中选择属性, 将每秒位数设置为115200,如图所示,确定退出。
2.设置虚拟机的系统启动项
开始 > 计算机,右键选择属性 > 高级 > 启动与故障恢复中打开 设置> 编辑 > 在boot文件的末尾添加下面的内容,保存
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /fastdetect /debugport=com2 /baudrate=115200
注意:串口的名称为新添加的虚拟串口的名称,在这里是com2,别搞错了,上面的内容是一行,不要添加回车符
关闭虚拟机系统
三.Windbg配置
在win7系统下安装windbg,采用默认的设置,一路next 安装即可,windbg不用自动创建快捷方式。
开始 > 搜索 windbg 找到windbg ,在桌面上创建一个快捷方式
右击windbg ,选择属性项 > 快捷方式,在目标框中 添加
-b -k com:pipe,port=\\.\pipe\com_1,resets=0
如果,自动改动了命名管道的名称,将com_1换成自定义的命称。
点击应用,确定
四.配置完成
启动虚拟机
选择debug模型进入系统,
以管理员权限运行windbg,
如果出现下面的界面,说明联机调试环境配置成功。
虚拟机系统启动过程会阻塞,在windbg中输入g,虚拟机系统继续启动。
到此为至,驱动的联机调试环境搭建完成。
五.调试驱动程序示例
我们从最简单的驱动程序入手 DriverTest.sys
驱动程序代码如下:
#include<NTddk.h>
VOID DriverUnload();
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath)
{
KdPrint(("DriverEntry"));
pDriver->DriverUnload = (PDRIVER_UNLOAD)DriverUnload;
return STATUS_SUCCESS;
}
VOID DriverUnload(PDRIVER_OBJECT driver)
{
KdPrint(("Unload Driver"));
}
按照之前的说明搭建好调试环境后,选用 windbg连上vmware,,如果虚拟机阻塞了,则在windbg中输入g命令,直到让虚拟机跑起来,把编译好的DriverTest.sys文件入放到虚拟机系统中,回到windbg,按 “ctrl + break”, windbg会让GuestOS暂停下来
输入命令 “bu DriverTest!Entry” 回车,可以在驱动程序的DriverEntry函数的入口点下一个延迟断点,其实bu的意思就是set unresolved breakpoint, windbg会记住这个断点,当这个驱动被加载了并且执行到这个地方,windbg会暂停GuestOS让你进行调试操作。
按下”ctrl + O” 打开源文件
还要设置符号路径。”ctrl + S”打开设置窗口,符号路径一般有两个,一个是你设置保存系统符号表(系统DLL的PDB文件)的路径,另一个是你驱动程序的PDB路径(和生成的.sys文件在一个目录下),以分号隔开,注意勾选reload,
等windbg将这些东西加载完毕,输入“g”,回车,让GuestOS跑起来。
在GuestOS里运行加载工具InstDrv把我们的驱动加载起来,启动驱动。
InstDrv是一个加载NT类型驱动的小工具,操作非常简单,不用讲了。
在windbg中可以发现程序已经在DriverEntry的入口处停了下来,我们可以进行源码调试了。
图中红色表示断点处,蓝色代码表示下一步将要执行的代码。
看一下windbg的工具类
从左到右依次是
打开 剪切 复制 粘贴
继续 重新开始 停止 调试 暂停
跳入 单步执行 跳出 运行到光标处
设置断点
命令行 查看内存 局部变量 寄存器 内存 栈 Scratch pad 进程和线程
Command Browsers Source mode off/on
字体
选项