比较主流的一个调试工具就是windbg.exe,不但可以调试内核也可以调试应用程序。本人做PC客户端开发的时候就经常用它生成dump文件来进行应用程序调试。但是它调试内核时,被设计为双机调试。调试机和被调试机通过串口进行连接,windbg必须安装在调试机上。
我的被调试机为虚拟机中的xp系统,要将系统设置为调试执行。首先要将系统保护的文件boot.ini显示出来,方法如图:
设置好之后点击应用-->确定,打开系统盘就可以看到boot.ini文件。在原来的基础上添加一行,修改后的内容如下:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /fastdetect /debug /debugport=com2 /baudrate=115200
其实就是将添加之前的最后一行复制粘贴后修改一下。需要特别注意的是/debugport的值要与串口对应。最多能设置四个端口,我的设置不了端口1,只能设置串行端口2,所以是/debugport=com2
因为被调试机是虚拟机,所以要设置VMware的管道虚拟串口,这个过程需要关闭虚拟机内的xp系统。
添加端口添加过程:
虚拟机设置-->硬件-->添加-->串行端口-->完成
设置端口过程:
使用命名管道-->\\.\pipe\com_1-->该端是服务器-->另一端是虚拟机-->I/O模式不选
主机windbg的启动参数设置,可以直接在快捷方式中进行添加命令行参数:
-k com:port=\\.\pipe\com_1,baud=115200,pipe
也可以直接通过命令行进行启动。
调试启动流程:
1、启动虚拟机内的xp系统,出现如下界面时启动主机的windbg,然后选择debug模式启动虚拟机内系统
虚拟机内系统完全启动后windbg界面如下:
如果一直停留在Waiting to reconnect... 请检查boot.ini文件添加的/debugport是否正确,或者点击windbg如下按钮:
如果出现虚拟机系统死机,可以在windbg的命令提示符kd>后面输入g命令回车尝试。
调试前的最后一步就是设置代码的路径和符号表的路径,windbg把内核视为一个整体,只需要在主菜单“File”下的“Symbol File Path”下设置相关路径就可以了。如果是多个路径需要用分号分隔。windows的每一个sys文件都有自己的符号表,可以从网上下载。在“Symbol File Path”中添加srv*c:\symbols*http://msdl.microsoft.com/download/symbols即可。
上面的步骤都顺利的话,现在已经可以开始调试自己写的sys文件了。可以通过"net start + 名称"和"net stop + 名称"命令在windbg中查看自己打印的信息。如果想要设置断点的话代码如下:
#include <ntddk.h>
// 提供一个Unload函数,只是为了让这个程序能动态卸载,方便调试
VOID DriverUnload(PDRIVER_OBJECT driver)
{
// 但是实际上我们什么都不做,只打印一句话
DbgPrint("first: Our driver is unloading...\r\n");
}
// DriverEntry, 入口函数,相当于main
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
#if DBG
_asm int 3
#endif
// 这是内核模块的入口,可以在这里写入我们想写的东西
DbgPrint("first: hello, sys!!!");
// 设置一个卸载函数,便于这个函数的退出
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
与之前的代码相比只是增加了三行
#if DBG
_asm int 3
#endif
这三行的作用是设置一个断点,int 3是一条汇编指令。但是这样的代码如果不是调试状态执行会导致系统蓝屏,所以加上宏DBG测试。重新编译后安装到虚拟机内的系统后就主机的windbg就会断到这行代码,接下来按照vs的调试方法F9,F10,F11进行调试就可以了。
最后贴上功成之图:蓝色是代码设置的断点,红色是F9设置的断点