Windows 调试工具支持虚拟机的内核调试。 虚拟机可以位于调试器所在的同一物理计算机上,也可以位于连接到同一网络的其他计算机上。 本主题介绍如何通过 KDCOM 使用虚拟 COM 端口手动设置虚拟机调试。
使用 KDNET 虚拟网络是一个更快的选项,建议使用。 有关详细信息,请参阅 使用 KDNET 设置虚拟机的网络调试。
设置目标虚拟机
运行调试器的计算机称为 主计算机,正在调试的虚拟机称为 目标虚拟机。
重要
在使用 BCDEdit 更改启动信息之前,可能需要在测试电脑上暂时挂起 Windows 安全功能,例如 BitLocker 和安全启动。 在测试完成后重新启用这些安全功能,并在禁用安全功能时适当地管理测试电脑。
在虚拟机中提升的“命令提示符”窗口输入以下命令。
bcdedit /debug on
bcdedit /dbgsettings 串行调试端口:nbaudrate:115200
其中,n 是虚拟机上的 COM 端口数。
在虚拟机中,将 COM 端口配置为映射到命名管道。 调试器将通过此管道进行连接。 有关如何创建此管道的详细信息,请参阅虚拟机的文档。
在提升模式下启动调试器,例如从管理员命令提示符处启动调试器。 当通过串行管道调试 VM 时,调试器必须以提升模式运行。 附加并运行调试器后,重新启动目标 VM。
使用 WinDbg 启动调试会话
在主计算机上,以管理员身份打开 WinDbg。 当通过串行管道调试 VM 时,调试器必须以提升模式运行。 在 文件 菜单上,选择 内核调试。 在“内核调试”对话框中,打开“COM”选项卡。选中 管道 框,然后选中 重新连接 框。 对于波特率,请输入 115200。 对于 重置,请输入 0。
如果调试器与虚拟机在同一台计算机上运行,请输入以下内容 端口。
\\.\pipe\PipeName.
如果调试器在与虚拟机不同的计算机上运行,请为 端口输入以下内容。
\\ VMHost\pipe\PipeName
选择“确定”。
还可以在命令行中启动 WinDbg。 如果调试器与虚拟机在同一物理计算机上运行,请在命令提示符窗口中输入以下命令。
windbg -k com:pipe,port=\\.\pipe\PipeName,resets=0,reconnect
如果调试器在虚拟机的不同物理计算机上运行,请在命令提示符窗口中输入以下命令。
windbg -k com:pipe,port=\\VMHost\pipe\PipeName,resets=0,reconnect
使用 KD 启动调试会话
若要调试在调试器所在的同一物理计算机上运行的虚拟机,请在“命令提示符”窗口中输入以下命令。
kd -k com:pipe,port=\\.\pipe\PipeName,resets=0,reconnect
若要调试与调试器在不同的物理计算机上运行的虚拟机,请在“命令提示符”窗口中输入以下命令。
kd -k com:pipe,port=\\VMHost\pipe\PipeName,resets=0,reconnect
参数
VMHost
指定运行虚拟机的计算机的名称。
PipeName
指定在虚拟机上创建的管道的名称。
resets=0
指定在主机和目标同步时,可以向目标发送无限数量的重置数据包。 对 Microsoft 虚拟电脑和其他管道丢弃多余字节的虚拟机使用 resets=0 参数。 如果 VMware 或其他虚拟机的管道不会丢弃所有多余字节,请勿使用此参数。
重新连接
导致调试器在发生读/写失败时自动断开连接并重新连接管道。 此外,如果在启动调试器时找不到名为 PipeName 的管道,那么 重新连接 参数会导致调试器等待该管道的出现。 对虚拟电脑和其他虚拟机使用 reconnect,它们会在计算机重启时销毁并重新创建管道。 不要将此参数用于在计算机重启期间保留其管道的 VMware 或其他虚拟机。
有关其他命令行选项的详细信息,请参阅 KD Command-Line 选项 或 WinDbg Command-Line 选项。
第 2 代虚拟机
默认情况下,COM 端口不会出现在第 2 代虚拟机中。 可以通过 PowerShell 或 WMI 添加 COM 端口。 若要使 COM 端口显示在 Hyper-V 管理器控制台中,必须使用路径创建它们。
若要在第 2 代虚拟机上使用 COM 端口启用内核调试,请执行以下步骤:
输入以下 PowerShell 命令禁用安全启动:
Set-VMFirmware –VmnameVmName–EnableSecureBoot Off
其中,VmName 是虚拟机的名称。
输入以下 PowerShell 命令,将 COM 端口添加到虚拟机:
Set-VMComPort –VMNameVmName1 \\.\pipe\PipeName
例如,以下命令将虚拟机 TestVM 上的第一个 COM 端口配置为连接到本地计算机上的命名管道 TestPipe。
Set-VMComPort –VMName TestVM 1 \\.\pipe\TestPipe
附加并运行调试器后,停止并冷启动 VM 以激活 VM 中的 COM 端口。 除非至少有一个实际配置了管道名称并且无法进行热添加,否则模拟的 UARTS 无法进行调试。
在完成更新配置更改后,重新启用安全启动。
有关第 2 代 VM 的详细信息,请参阅 第 2 代虚拟机概述。
言论
如果目标计算机已停止响应,目标计算机仍因早期内核调试操作而停止,或者使用了 -b命令行选项,调试器会立即进入目标计算机。
否则,目标计算机将继续运行,直到调试器命令它中断。
排查防火墙和网络访问问题
调试器(WinDbg 或 KD)必须通过防火墙进行访问。 这甚至可以适用于网络适配器支持的虚拟串行端口。
如果 Windows 提示你在加载调试器时关闭防火墙,请选择所有三个框。
根据所使用的 VM 的具体信息,可能需要更改虚拟机的网络设置,以将它们桥接到Microsoft内核网络调试适配器。 否则,虚拟机将无法访问网络。
Windows 防火墙
可以使用控制面板允许通过 Windows 防火墙进行访问。 打开控制面板 > 系统和安全性,然后选择“允许应用通过 Windows 防火墙”。 在应用程序列表中,找到 Windows GUI 符号调试器,Windows 内核调试器。 使用复选框允许这两个应用程序通过防火墙。 重启调试应用程序(WinDbg 或 KD)。
第三方虚拟机
VMWare
如果使用 VMWare 设施(例如重置按钮)重新启动虚拟机,请退出 WinDbg,然后重启 WinDbg 以继续调试。 在虚拟机调试期间,VMWare 通常消耗 100% 的 CPU。