Windows Kernel: Debug Environment

Debug with QEMU

QEMU模式下可以选择直接使用-s启动gdbserver来调试内核,速度比较快,而且可以比较直观看到运行情况,不过没办法加载符号表,Crash后详情信息没办法Analyze
Tip:可以在最后稳定调试阶段,记录好符号地址,在qemu monitor中savevm,然后每次运行loadvm即可(这样可以便利很多调试场景)
可以选择开启两个QEMU,其中一个作为调试器,使用Windbg通过串口调试
比较稳定且同时可以支持远程的方案:

1
2
3
4
调试机:
-serial tcp::9090,server,nowait
被调试机:
-serial tcp:127.0.0.1:9090

或者添加串口设备(我在尝试的时候不是很稳定):

1
2
3
4
5
6
调试机:
-chardev socket,id=serial1,path=/tmp/serial,server,nowait \
-device isa-serial,chardev=serial1,id=serial1
被调试机:
-chardev socket,id=serial1,path=/tmp/serial \
-device isa-serial,chardev=serial1,id=serial1

在被调试机中开启debug模式:

1
2
3
4
5
6
bcdedit /set debug on
bcdedit /set debugtype serial
bcdedit /set debugport 1
bcdedit /set baudrate 115200
bcdedit /set {bootmgr} displaybootmenu yes
bcdedit /timeout 10

在调试机的Windbg中设置好Kernel Debug的端口和波特率
设置Symbols Path:

1
srv*c:\symbols*http://msdl.microsoft.com/download/symbols

Windbg启动连接等待
重启被调试机,开机选项选择debug模式即可
等待连接成功,即可调试

Debug with Vmware (MacOS)

PS:QEMU到Vmware的镜像切换
当有在qemu中安装好的windows的qcow2时,首先转换至vmdk格式

1
qemu-img convert -f qcow2 windows10.qcow2 -O windows10.vmdk

新建一个对应位数的Windows虚拟机(选择BIOS模式),不需要安装iso
将虚拟机文件中的虚拟磁盘的vmdk文件删除
将前面转换好的vmdk复制进去,再次打开虚拟机提示虚拟磁盘文件缺失,重新选择复制进去的vmdk即可
编辑vmx文件:
被调试机:

1
2
3
4
5
6
//serial1代表com1
serial1.present = "TRUE"
serial1.fileType = "pipe"
serial1.fileName = "/Users/user/Downloads/serial"
serial1.tryNoRxLoss = "FALSE"
serial1.pipe.endPoint = "server"

调试机:

1
2
3
4
5
6
serial1.present = "TRUE"
serial1.fileType = "pipe"
serial1.startConnected = "TRUE"
serial1.fileName = "/Users/user/Downloads/serial"
serial1.tryNoRxLoss = "FALSE"
serial1.pipe.endPoint = "client"

被调试机中开启debug模式:

1
2
3
4
bcdedit /copy {current} /d "Win10"
bcdedit /debug ON
bcdedit /bootdebug ON
bcdedit /timeout 10

Win+R进入msconfig
选择新建的启动项,在高级设置中开启Debug,选择对应端口和波特率(115200)即可
这里端口的选择有点玄学,主要看自己的设备管理器中对应的端口,可能需要多尝试几次
(在本地,我设置被调试机Debug端口为com1,调试机端口为com2)
而后重启被调试机,以对应的Debug模式启动即可