在Windows主机上调试运行在Windows虚拟机中的内核驱动程序是一种常见的开发和调试场景。使用WinDbg(Windows Debugger)可以实现这一目标。以下是详细的步骤,帮助你在Windows主机上调试虚拟机中的内核驱动程序。
准备工作
-
安装WinDbg:
- 在主机和虚拟机上都安装最新的Windows SDK,其中包含WinDbg。可以从微软官方网站下载并安装。
-
配置虚拟机:
- 使用虚拟机软件(如VMware Workstation、Hyper-V、VirtualBox等)创建并运行一个Windows虚拟机。
配置目标系统(虚拟机)
-
启用内核调试模式:
- 在虚拟机中打开命令提示符(以管理员身份运行)。
- 使用
bcdedit
命令启用内核调试模式。例如,使用串口调试:bcdedit /debug on bcdedit /dbgsettings serial debugport:1 baudrate:115200
- 使用网络调试:
bcdedit /debug on bcdedit /dbgsettings 1394 channel:1
-
配置虚拟机的调试接口:
- 串口调试:
- 在虚拟机软件中配置一个串口连接到主机的管道。
- 例如,在VMware中,设置串口为“管道”,名称为
\\.\pipe\com_1
,确保主机和虚拟机的管道名称一致。
- 网络调试:
- 在虚拟机软件中配置一个网络适配器,确保主机和虚拟机在同一网络中。
- 配置虚拟机的网络适配器使用NAT或桥接模式。
- 串口调试:
-
重启虚拟机:
- 重启虚拟机,确保内核调试模式生效。
配置主机系统
-
启动WinDbg:
- 在主机上启动WinDbg。
- 选择“文件” -> “内核调试” -> “连接到目标机”。
-
配置WinDbg连接到虚拟机:
- 串口调试:
File -> Kernel Debug... -> COM -> COM1 (选择主机上的串口) -> 波特率 115200
- 网络调试:
- 获取虚拟机的IP地址。
- 在WinDbg中配置网络调试:
File -> Kernel Debug... -> TCP -> 输入虚拟机的IP地址和端口(默认5551)
- 串口调试:
-
加载符号文件:
- 确保WinDbg能够访问内核符号文件(如
vmlinux
)和驱动程序的源代码及符号文件。 - 设置符号文件路径:
.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
- 加载驱动程序的PDB文件:
.sympath+ c:\path\to\your\pdb\files
- 确保WinDbg能够访问内核符号文件(如
开始调试
-
连接到目标系统:
- 在WinDbg中点击“确定”连接到目标系统。
- 虚拟机将暂停在引导过程中,等待调试器连接。
-
设置断点:
- 在WinDbg中设置断点。例如,设置断点在驱动程序的某个函数上:
bp YourDriver!YourFunction
- 在WinDbg中设置断点。例如,设置断点在驱动程序的某个函数上:
-
继续执行:
- 使用
g
命令继续执行虚拟机:g
- 使用
-
调试操作:
- 单步执行:
t
- 查看调用堆栈:
k
- 查看变量:
dt YourDriver!YourStruct
- 单步执行:
示例
假设你有一个名为MyDriver.sys
的驱动程序,并且你已经编译并安装到了虚拟机中,以下是一个完整的调试步骤示例:
-
在虚拟机中配置内核调试模式:
bcdedit /debug on bcdedit /dbgsettings 1394 channel:1
-
重启虚拟机:
- 重启虚拟机,确保内核调试模式生效。
-
在主机上启动WinDbg:
- 打开WinDbg。
- 选择“文件” -> “内核调试” -> “连接到目标机”。
- 配置网络调试:
File -> Kernel Debug... -> TCP -> 输入虚拟机的IP地址(例如192.168.1.2)和端口5551
-
加载符号文件:
- 设置符号文件路径:
.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
- 加载驱动程序的PDB文件:
.sympath+ c:\path\to\your\pdb\files
- 设置符号文件路径:
-
连接到目标系统:
- 点击“确定”连接到目标系统。
-
设置断点并调试:
- 设置断点:
bp MyDriver!DriverEntry
- 继续执行:
g
- 当断点触发时,使用
k
查看调用堆栈,使用t
单步执行,使用dt
查看结构体等。
- 设置断点:
总结
通过以上步骤,你可以在Windows主机上使用WinDbg调试运行在Windows虚拟机中的内核驱动程序。确保主机和虚拟机的网络或串口配置正确,符号文件路径设置正确,断点设置合理,可以有效进行内核驱动程序的调试。