使用虚拟 COM 端口手动设置虚拟机的内核模式调试

Windows 调试工具支持虚拟机的内核调试。 虚拟机可以位于调试器所在的同一物理计算机上,也可以位于连接到同一网络的其他计算机上。 本主题介绍如何通过 KDCOM 使用虚拟 COM 端口手动设置虚拟机调试。

建议使用 KDNET 虚拟网络,这样更快。 有关详细信息,请参阅 使用 KDNET 设置虚拟机的网络调试

设置目标虚拟机

运行调试器的计算机称为主机,被调试的虚拟机称为 目标虚拟机

重要

在使用 BCDEdit 更改启动信息之前,可能需要在测试电脑上暂时挂起 Windows 安全功能,例如 BitLocker 和安全启动。 测试完成后重新启用这些安全功能,并在禁用安全功能时适当地管理测试电脑。

  1. 在虚拟机中提升的“命令提示符”窗口输入以下命令。

    bcdedit /debug on

    bcdedit /dbgsettings serial debugport:nbaudrate:115200

    其中 n 是虚拟机上的 COM 端口数。

  2. 在虚拟机中,配置 COM 端口以映射到命名管道。 调试器将通过此管道进行连接。 有关如何创建此管道的详细信息,请参阅虚拟机的文档。

  3. 在提升模式下启动调试器,例如从管理员命令提示符处启动。 当通过串行管道调试 VM 时,调试器必须以提升模式运行。 附加并运行调试器后,重新启动目标 VM。

使用 WinDbg 启动调试会话

在主机上以管理员身份打开 WinDbg。 当通过串行管道调试 VM 时,调试器必须以提升模式运行。 在“文件”菜单上,选择“内核调试”。 在“内核调试”对话框中,打开COM选项卡。选中 Pipe 框,然后选中 Reconnect 框。 对于波特率,请输入 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 或其他虚拟机的管道不会丢弃所有多余字节,请勿使用此参数。

reconnect
使调试器在发生读/写失败时自动断开连接并重新连接管道。 此外,如果调试器在启动调试器时找不到命名管道,则 reconnect 参数会导致调试器等待名为 PipeName 的管道出现。 对虚拟电脑和其他虚拟机使用 reconnect,它们会在计算机重启时销毁并重新创建管道。 对于 VMware 或其他在计算机重启期间保留管道的虚拟机,请勿使用此参数。

有关其他命令行选项的详细信息,请参阅 KD 命令行选项WinDbg 命令行选项

第 2 代虚拟机

默认情况下,第 2 代虚拟机中不显示COM 端口。 可以通过 PowerShell 或 WMI 添加 COM 端口。 若要在 Hyper-V 管理器控制台中显示 COM 端口,必须使用路径创建它们。

若要在第 2 代虚拟机上使用 COM 端口来启用内核调试,请执行以下步骤:

  1. 输入以下 PowerShell 命令禁用安全启动:

    Set-VMFirmware –VmnameVmName–EnableSecureBoot Off

    其中 VmName 是虚拟机的名称。

  2. 输入以下 PowerShell 命令,将 COM 端口添加到虚拟机:

    Set-VMComPort –VMNameVmName1 \\.\pipe\PipeName

    例如,以下命令在虚拟机 TestVM 上配置第一个 COM 端口,以在本地计算机上连接到名为 TestPipe 的命名管道:

    Set-VMComPort –VMName TestVM 1 \\.\pipe\TestPipe

  3. 附加并运行调试器后,停止并冷启动 VM 以激活 VM 中的 COM 端口。 除非至少有一个实际配置了管道名称并且无法进行热添加,否则模拟的 UARTS 无法进行调试。

  4. 在完成更新配置更改后,重新启用安全启动。

有关第 2 代 VM 的详细信息,请参阅 Generation 2 Virtual Machine Overview

备注

如果目标计算机已停止响应,目标计算机仍因早期内核调试操作而停止,或者使用了 -b命令行选项,调试器会立即进入目标计算机。

否则,目标计算机将继续运行,直到调试器命令它中断。

排查防火墙和网络访问问题

调试器(WinDbg 或 KD)必须通过防火墙进行访问。 甚至网络适配器支持的虚拟串行端口也会出现这种情况。

如果 Windows 提示您在加载调试器时关闭防火墙,请选择所有三个框。

根据所用 VM 的具体信息,可能需要更改虚拟机的网络设置,以将它们桥接到 Microsoft 内核网络调试适配器。 否则,虚拟机将无法访问网络。

Windows 防火墙

可以使用控制面板允许通过 Windows 防火墙进行访问。 打开“控制面板”>“系统和安全”,然后选择“允许应用通过 Windows 防火墙”。 在应用程序列表中,找到 Windows GUI 符号调试器Windows 内核调试器。 使用复选框允许这两个应用程序通过防火墙。 重启调试应用程序(WinDbg 或 KD)。

第三方 VM

VMWare如果通过使用 VMWare 设施(例如重置按钮)重新启动虚拟机,请退出 WinDbg,然后重启 WinDbg 以继续调试。 在虚拟机调试期间,VMWare 通常消耗 100% 的 CPU。

另请参阅

使用 KDNET 设置虚拟机的网络调试

手动设置内核模式调试

设置虚拟机主机的网络调试