测试过程中经常会遇到不符合预期的场景需进一步调试分析问题,一般情况下可以在本机进行调试,通过打印调试信息或者抓取 dump 进行分析。但是有时候,系统在崩溃时可能无法生成内存转储文件,或者出现系统挂起而不崩溃。在得不到转储文件的情况下,或者调试内核问题时,又或者查看一些高权限进程信息时,都可以通过双机调试来帮助定位分析问题。而且相比较于内存转储,双机调试可以调试到系统启动阶段和之后任意时刻的问题,这是内存转储做不到的。
双机调试主要分为两种情况:
1.被调试系统运行在虚拟机中
2.被调试系统运行在另外一台真实的物理机中
当被调试系统运行在虚拟机中,可以使用虚拟 com 串口和 VirtualKD 两种方式进行双机调试;当被调试系统运行在真实物理机中时,可以使用串口和网络两种方式。
1.Virtualkd 方式
相比较使用虚拟 com 串口来进行双机调试,传输速率大概是 10kb/s,virtualkd 的传输速率可达 4.5m/s,极大提高了数据交换速率,而且由于安装和使用都比较简单,所以 virtualkd 逐步取代了虚拟 com 串口,成为了更普遍的双机调试工具。
Virtualkd 的主要原理是:利用 KD(内核调试引擎 Kernel Debug)的扩展 dll 功能,向虚拟机 patch 一个进程,二者通过 pipe 来进行通信。
Ⅰ.安装环境
①.vmware 版本:16pro,vmware 镜像:win7x64
②.物理机环境:win10x64
③.VirtualKD-Redux(VMware15.5 以下,VirtualKD3.0 与 VMware15.5 不兼容。VMware15.5 及可以使用 VirtualKD-Redux)
VirtualKD3.0下载地址:https://sysprogs.com/legacy/virtualkd/download/
VirtualKD-Redux下载地址:https://toscode.gitee.com/wangwanfeng520/VirtualKD-Redux
④.windbg 版本:10.0.18362.1
windbg 包含在 windows sdk 中。可以到https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools下载。如果只需要 windbg,推荐下载 .exe 形式的安装包。在安装的时候,可以只勾选 Debugging Tools for Windows。
⑤.windbg 符号设置:从微软服务器下载符号文件,并将文件保存到本地目录:"C:\Symbols"(这个目录可以自己更改)
Ⅱ.搭建双机调试环境
①.物理机配置:在 VirtualKD-Redux 目录下,打开 vmmon64.exe 程序,并配置调试器 windbg 路径
②.虚拟机配置:在 VirtualKD-Redux 目录下,把 target64 文件夹拷贝到虚拟机中
(如果虚拟机是 32 位系统则把 target32 文件夹拷贝到虚拟机中),并在虚拟机中运行 target 文件夹中的 vminstall.exe,安装完毕后重启虚拟机
③.vminstall.exe 在虚拟机中安装重启后,选择新建立的 Entry(开机选项),并且按 F8 选择禁用强制签名
④.一般情况下,物理机上 vmmon64.exe 配置的调试器会自动弹出并连接到被调试系统(因为 Start debugger automatically 默认是勾选状态)。
如果调试器没自动弹出,或者意外的关闭了调试器,可以通过点击 Run Debugger 按钮,手动启动调试器。
⑤.此时虚拟机里面的系统是卡在了启动处,在 windbg 窗口输入 g 然后按回车,让目标系统继续运行
2.网络方式
有时候一些测试场景无法在虚拟机中进行验证,这个时候就需要在两台物理机上搭建双机调试。使用串口方式的话需要额外购买串口线,同时传输速率也很低。所以通过网络进行双机调试会更方便和高效。但是网络方式会要求目标机器系统需要是 win8 及以上,不过随着操作系统不断的升级更新,大部分机器都可以满足要求。
首先介绍下两个概念:
目标机器:指的是部署了测试环境,需要被调试的机器
调试主机:指的是安装了调试器,需要对目标机器进行调试的机器
Ⅰ.环境设置:
①.目标机器操作系统:win10x64
②.调试主机操作系统:win10x64
③.调试主机需要安装 windbg,版本:10.0.18362.1
Ⅱ.搭建双机调试环境
①.使用 ping 命令确定目标机器和调试主机网络可以联通
②.关闭目标机器防火墙,然后重启系统
③.在目标机器上用管理员权限打开 cmd,输入以下命令:
bcdedit /set {default} DEBUG YES
bcdedit /debug on
bcdedit /dbgsettings net hostip:192.168.0.110 port:55555 key:your.own.safe.key
需要注意的是:
hostip 是指调试主机的 ip,不是目标机器的 ip
端口号必须大于 49151 并且小于 65536
④.在调试主机上用管理员权限打开 windbg,选择 kernel debug,输入目标机器配置的端口号和密码
⑤.等待一会后连接成功
1.定位系统卡慢问题
①.在出现卡慢的时机,在 windbg 选择 break 挂起被测试虚拟机
②.通过命令行 “.dump /ma C:\testdump.dmp” 来获取 dump,或者使用命令行.crash 来使被测试虚拟机系统蓝屏,来获取系统储存的蓝屏 dump。
2.开机或者关机等本地环境不方便查看调试信息,通过双机调试输出调试信息
①.设置注册表来抓取内核态调试信息:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter] 值为 dword 类型 0000000f
②.通过 reboot 命令使被测试虚拟机重启,windbg 会自动输出被测试虚拟机重新开机的所有调试信息。
3.查看系统加载的驱动版本
一般工具查看的驱动版本仅是 drivers 目录下的驱动文件版本,系统内存中加载的驱动版本需要通过双机调试来确认。
①.在需要确认系统加载驱动(或其他模块)的时机,在 windbg 选择 break 挂起被测试虚拟机
②.输入命令 lmdrv,可以列出所有驱动文件,根据签名时间戳就可以确定内存中加载的驱动版本
1.普通的测试场景都可以在本地进行调试和分析,但是一些涉及到系统譬如卡慢,卡死,蓝屏等,就需要借助于双机调试来获取日志,来进一步定位和分析问题。
2.双机调试对于内核的测试帮助更大,相较于应用层程序,驱动不稳定就会导致蓝屏,所以在本机进行测试新驱动时难度会比较大。一般新驱动的测试会选择在虚拟机中加载驱动,及时保存测试快照,通过搭建双机调试环境进行验证。