使用虚拟 COM 端口手动设置虚拟机 Kernel-Mode 调试

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

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

设置目标虚拟机

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

重要

使用 BCDEdit 更改启动信息之前,您可能需要临时挂起 Windows 安全功能,例如 BitLocker 和在测试 PC 上的安全启动。 当安全功能处于禁用状态时,在测试完成后重新启用这些安全功能,并对测试 PC 进行适当的管理。

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

    bcdedit/debug on

    bcdedit/dbgsettings 串行 debugport:n波特率: 115200

    其中, n 是虚拟机上的 COM 端口的编号。

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

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

使用 WinDbg 启动调试会话

在主计算机上,以管理员身份打开 WinDbg。 在通过串行管道调试 VM 时,必须在提升模式下运行调试器。 在 " 文件 " 菜单上,选择 " 内核调试"。 在 "内核调试" 对话框中,打开 " COM " 选项卡。选中 " 管道 " 框,并选中 " 重新连接 " 框。 对于 波特率,请输入115200。 对于 " 重置",请输入0。

如果调试器在虚拟机所在的同一台计算机上运行,请输入以下端口作为 端口

\\.\Pipe\PipeName

如果调试器在不同于虚拟机的计算机上运行,请输入以下 端口作为端口

\\\\\pipe\PipeName

选择“确定”。

还可以在命令行中启动 WinDbg。 如果调试器在虚拟机所在的物理计算机上运行,请在命令提示符窗口中输入以下命令。

windbg-k com:管道,端口 = \\.\Pipe\PipeName,重置 = 0,重新连接

如果调试器在不同于虚拟机的物理计算机上运行,请在命令提示符窗口中输入以下命令。

windbg-k com: pipes,端口 = \ \VMHost\pipe\PipeName,重置 = 0,重新连接

使用 KD 启动调试会话

若要调试与调试器运行在同一物理计算机上的虚拟机,请在 提升 的命令提示符窗口中输入以下命令。

kd-k com: pipe,port = \\.\Pipe\PipeName,重置 = 0,重新连接

若要从调试器调试在不同物理计算机上运行的虚拟机,请在命令提示符窗口中输入以下命令。

kd-k com: pipe、port = \\VMHost\pipe\PipeName、重置 = 0、reconnect

Parameters


指定正在运行虚拟机的计算机的名称。


指定在虚拟机上创建的管道的名称。


指定当主机和目标正在同步时,可以将不限数量的重置数据包发送到目标。 对 Microsoft Virtual PC 和管道丢弃多余字节的其他虚拟机使用 重置 = 0 参数。 不要将此参数用于 VMware 或其他不删除多余字节的虚拟机。


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

有关其他命令行选项的详细信息,请参阅 KD Command-Line optionsWinDbg Command-Line options

第2代虚拟机

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

若要使用第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 的详细信息,请参阅 第2代虚拟机概述

备注

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

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

防火墙和网络访问问题疑难解答

你的调试器 (WinDbg 或 KD) 必须具有通过防火墙的访问权限。 这甚至是网络适配器支持的虚拟串行端口的情况。

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

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

Windows 防火墙

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

第三方 Vm

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

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

手动设置内核模式调试

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