文章目录
一、什么是双机调试
-
为什么需要双机调试?
我们知道在用户层调试一个普通程序时,整个被调试程序会被中断。同样的,如果被调试的是操作系统内核,那么整个操作系统都会被中断。所以如果想要调试Win内核,那么就需要两台电脑,一台运行WinDBG作为调试机,一台作为被调试机,这就是所谓“双机调试”。 -
双机调试的原理
在操作系统中提供了一个调试子系统,通过串口发送、接收调试信息。例如,本机在WinDBG中通过串口向虚拟机的调试子系统发送“g”指令,调试子系统就会做出相应操作(使虚拟机继续运行)。 -
开发环境
Host OS(主机):Win10 x64 1803
Guest OS(被调试):Win7 x86 Professional 和 WinXP SP3 x86
调试工具: WinDBG x64 + VS2019 + Win10 SDK 10.0.18362.0
二、为Guest OS添加“DEBUG模式的开机引导项”和“串口”
2.1 Win 7
- 管理员运行CMD
- 复制一个开机选项,命名为‘MyDebug’
bcdedit /copy {current} /d DebugEntry \\将生成一段ID
- 设置‘MyDebug’开机启动为DEBUG模式
bcdedit /debug {上面生成的ID} ON
- 增加一个开机引导项
bcdedit /displayorder {current} {上面生成的ID}
- 开启串口1
bcdedit /dbgsettings serial baudrate:115200 debugport:1
2.2 Win XP
- 在文件夹选项中设置显示系统文件、显示所有文件,随后可以在C盘根目录看到boot.ini文件
- 为GuestOS添加一个启动项,开启串口"com1"
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MyDEBUG" /noexecute=optin /fastdetect /debug /debugport=com1
三、虚拟机开启“串口”
- 观察“虚拟机设置”这个对话框的“硬件”->“设备栏”,看看是否有“打印机”或“Printer”,如果有,则删除该设备。
- 选择“添加”,然后选择“串行端口”,然后选择“使用命名管道”,并按如下设置
\\.\pipe\com_1
四、安装WinDBG
-
微软官网下载WDK,需要先安装Visual Studio,注意工作负载中选择与WDK对应版本的Win10 SDK
(图中为 Windows10 1903 >>> VS2019 >>> Win10 SDK 10.0.18362.0)
-
在桌面上添加一个windbg的快捷方式
-
右键该快捷方式,打开“属性”对话框,在目标一栏的末尾添加【 -b -k com:pipe,port=\.\pipe\com_1,resets=0】
五、开始调试
- 先启动虚拟机的GuestOS,然后马上启动WinDBG
- 在Guest OS中选择【XXX 启动调试程序】这个开机启动项
- WinDBG会在GuestOS的开机过程中自动断下:
- 在WinDBG中输入命令【g】向GuestOS的“调试子系统”发送继续执行的消息,随后可以看到GuestOS正常开机进入桌面。
- 在WinDBG中点击【Break】按钮,GuestOS将会被中断卡死。