驱动开发之调试内核模块

本文详细介绍了如何使用Windbg调试Windows XP内核及应用程序,包括设置调试环境、修改boot.ini文件、配置VMware串口、启动参数设置以及调试过程。通过Windbg的调试功能,可以定位和解决系统级问题,同时展示了如何设置断点并进行调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比较主流的一个调试工具就是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设置的断点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古道青阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值