1. 概述
1.1. 原理
通过qemu-system程序启动的虚机,命令行里一般带有monitor。连接上这个monitor,可以启动gdbserver。通过此gdbserver,可以查看虚机的cpu寄存器,虚拟地址内存等。同时,qemu-system提供了一个tcpserver。另一台机的windbg可以连接上这个tcpserver,进而调试虚机。
1.2. 推荐场景
虚机windows未开启调试,但是虚机偶发的卡死发生时。
1.3. 优劣
优势:
A. 不需被调试机bcdedit事先配置
B. 若开启嵌套虚拟化,还能观察L1虚机的hvix64的代码运行
缺陷和限制:
仅限于qemu-system启动的虚机,tci产品不支持。
windbg里定位pe模块比较复杂。
2. qemu主机配置
2.1. 以新平台的idv为例
在qemu-system的命令行中可以看到-qmp unix:/tmp/vm.monitor,server,nowait,由此,在linux shell里执行qmp-shell -H /tmp/vm.monitor即可进入qmp的交互终端。
输入gdbserver tcp::35100得到Waiting for gdb connection on device 'tcp::35100'即表明gdbserver开启成功。gdbserver默认端口1234,会被ranios的防火墙拦截。这里推荐端口选35100,它在rainos防火墙的白名单中。
退出qmp交互终端用Ctrl+d,不可用Ctrl+c,它会让qemu-system进程终止。
2.2 vdi
先找出vdi虚机的id和所在运行服务器。ssh连上服务器,先找出虚机对应的domain:
virsh list|grep 120fb070-6b04-4766-b534-38e3131a6c11
得到315 120fb070-6b04-4766-b534-38e3131a6c11 running。
遂用libvirt打开它的gdbserver
virsh qemu-monitor-command 315 --hmp gdbserver tcp::35900
3. 调试机配置
ExdiGdbSrv.dll(64位),exdiConfigData.xml,systemregisters.xml我已集成到\\rcc.ruijie.net\Upload\lida\Microsoft.WinDbg_1.2202.7001.0.zip。
设置环境变量:
EXDI_GDBSRV_XML_CONFIG_FILE为"C:\Program F