使用虚拟 COM 端口手动设置虚拟机的内核模式调试
Windows 调试工具支持虚拟机的内核调试。 虚拟机可以位于调试器所在的同一物理计算机上,也可以位于连接到同一网络的其他计算机上。 本主题介绍如何通过 KDCOM 使用虚拟 COM 端口手动设置虚拟机调试。
使用 KDNET 虚拟网络是一个更快的选项,建议使用。 有关详细信息,请参阅 使用 KDNET 设置虚拟机的网络调试。
运行调试器的计算机称为 主计算机,正在调试的虚拟机称为 目标虚拟机。
重要
在使用 BCDEdit 更改启动信息之前,可能需要在测试电脑上暂时挂起 Windows 安全功能,例如 BitLocker 和安全启动。 在测试完成后重新启用这些安全功能,并在禁用安全功能时适当地管理测试电脑。
在虚拟机中提升的“命令提示符”窗口输入以下命令。
bcdedit /debug on
bcdedit /dbgsettings 串行调试端口:nbaudrate:115200
其中,n 是虚拟机上的 COM 端口数。
在虚拟机中,将 COM 端口配置为映射到命名管道。 调试器将通过此管道进行连接。 有关如何创建此管道的详细信息,请参阅虚拟机的文档。
在提升模式下启动调试器,例如从管理员命令提示符处启动调试器。 当通过串行管道调试 VM 时,调试器必须以提升模式运行。 附加并运行调试器后,重新启动目标 VM。
在主计算机上,以管理员身份打开 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 -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 选项。
默认情况下,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 设施(例如重置按钮)重新启动虚拟机,请退出 WinDbg,然后重启 WinDbg 以继续调试。 在虚拟机调试期间,VMWare 通常消耗 100% 的 CPU。