手动设置 KDNET 网络内核调试

Windows 调试工具支持通过网络进行内核调试。 本主题介绍如何手动设置网络调试。

重要

手动设置网络调试是一个复杂且容易出错的过程。 若要自动设置网络调试,请参阅 自动设置 KDNET 网络内核调试强烈建议所有调试器用户使用 KDNET 实用工具。

运行调试器的计算机称为 主计算机,正在调试的计算机称为 目标计算机。 主计算机必须运行 Windows 7 或更高版本,目标计算机必须运行Windows 8或更高版本。

与对其他类型的连接进行调试相比,通过网络进行调试具有以下优势。

  • 主机和目标计算机可以位于本地网络上的任意位置。
  • 从一台主计算机调试多个目标计算机很容易。
  • 给定任意两台计算机,它们很可能都有以太网适配器。 它们都有串行端口或两者都有 1394 个端口的可能性较小。
  • 网络调试明显快于串行端口调试。

支持的网络适配器

主计算机可以使用任何网络适配器,但目标计算机必须使用 Windows 调试工具支持的网络适配器。 有关支持的网络适配器列表,请参阅支持在 Windows 10 中进行网络内核调试的以太网 NICWindows 8.1 中用于网络内核调试的受支持的以太网 NIC

安装适用于 Windows 的调试工具

确认在主机系统上安装了适用于 Windows 的调试工具。 有关下载和安装调试器工具的信息,请参阅 下载适用于 Windows 的调试工具

确定主计算机的 IP 地址

使用以下过程之一来确定主计算机的 IP 地址。

  1. 在主计算机上,打开命令提示符窗口并输入以下命令:

    ipconfig
    

    记下要用于调试的网络适配器的 IPv4 地址。

  2. 在目标计算机上,打开命令提示符窗口并输入以下命令,其中 YourIPAddress 是主计算机的 IP 地址:

    ping -4 <YourIPAddress>
    

选择用于网络调试的端口

选择将用于在主机和目标计算机上进行调试的端口号。 可以选择从 49152 到 65535 的任何数字,建议的范围是 50000 - 50039。 你选择的端口将由主计算机上运行的调试器打开以独占访问。 请谨慎选择在主计算机上运行的任何其他应用程序不使用的端口号。

注意 可用于网络调试的端口号范围可能受公司网络策略的限制。 无法从主计算机判断限制是什么。 若要确定公司的策略是否限制可用于网络调试的端口范围,请与网络管理员联系。

如果将多个目标计算机连接到单个主计算机,则每个连接必须具有唯一的端口号。 例如,如果将 100 台目标计算机连接到单个主计算机,则可以将端口 50000 分配给第一个连接,将端口 50001 分配给第二个连接,将端口 50002 分配给第三个连接,等等。

注意 另一台主计算机可以使用相同范围的端口 (50000 到 50099) 连接到另外 100 台目标计算机。

设置目标计算机

  1. 验证目标计算机是否具有受支持的网络适配器。 有关详细信息,请参阅这些主题。

  2. 使用适当的网络电缆将受支持的适配器连接到网络中心或交换机。

重要

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

  1. 在提升的命令提示符窗口中,输入以下命令,其中 w.x.y.z 是主计算机的 IP 地址, n 是所选的端口号:

    bcdedit /debug on
    
    bcdedit /dbgsettings net hostip:w.x.y.z port:n
    
  2. bcdedit 将显示自动生成的密钥。 复制密钥并将其存储在 USB 闪存驱动器等可移动存储设备上。 在主计算机上启动调试会话时,将需要密钥。

    注意 强烈建议使用自动生成的密钥。 但是,可以创建自己的密钥,如后面“创建自己的密钥”部分中所述。

  3. 使用 设备管理器 确定要用于调试的适配器的 PCI 总线、设备和函数编号。 这些值显示在“常规”选项卡上的“位置”下的设备管理器中。然后在提升的命令提示符窗口中,输入以下命令,其中 bdf 是适配器的总线编号、设备编号和函数编号:

    bcdedit /set "{dbgsettings}" busparams b.d.f
    
  4. 附加内核调试器后,将重新启动目标电脑。 这将在下一部分中介绍。

注意 如果打算在目标计算机上安装 Hyper-V 角色,请参阅 设置虚拟机主机的网络调试

谨慎 如果目标计算机位于扩展坞中,并且你为作为扩展坞一部分的网络适配器启用了网络调试,请不要从扩展坞中删除计算机。 如果需要从扩展坞中删除目标计算机,请先禁用内核调试。 若要在目标计算机上禁用内核调试,请以管理员身份打开命令提示符窗口,然后输入 bcdedit /debug 关闭命令。 重新启动目标计算机。

启动调试会话

使用适当的网络电缆确认主机的网络适配器到网络中心或交换机。

在主计算机上,打开 WinDbg。 在“ 文件 ”菜单上,选择“ 内核调试”。 在“内核调试”对话框中,打开“ Net ”选项卡。输入端口号和密钥。 选择“确定”。

还可以通过打开命令提示符窗口并输入以下命令来启动 WinDbg 会话,其中 n 是端口号, MyKeybcdedit 在设置目标计算机时自动生成的密钥:

windbg -k net:port=<n>,key=<MyKey>

如果系统提示允许 WinDbg 通过防火墙访问端口,请允许 WinDbg 访问 所有三 种不同网络类型的端口。

使用 KD

在主计算机上,打开命令提示符窗口。 输入以下命令,其中 n 是端口号, MyKeybcdedit 在设置目标计算机时自动生成的密钥:

kd -k net:port=<n>,key=<MyKey>

如果系统提示允许 WinDbg 通过防火墙访问端口,请允许 WinDbg 访问 所有三 种不同网络类型的端口。

重启目标电脑

调试器连接并等待连接后,重新启动目标计算机。 重启电脑的一种方法是从管理员的命令提示符使用此命令。

shutdown -r -t 0

重新启动目标时,主机 OS 中的调试器应连接。

连接到主机上的目标后,在调试器上命中中断,即可开始调试。

允许调试器通过防火墙

首次尝试建立网络调试连接时,系统可能会提示你允许调试应用程序 (WinDbg 或 KD) 通过防火墙进行访问。 Windows 的客户端版本会显示提示符,但 Windows 的服务器版本不显示提示。 应通过选中 所有三 种网络类型的框来响应提示:域、专用和公用。 如果未收到提示,或者在提示可用时未选中复选框,则必须使用 控制面板 允许通过防火墙进行访问。 打开控制面板>系统和安全,然后选择“允许应用通过 Windows 防火墙”。 在应用程序列表中,找到 Windows GUI 符号调试器和 Windows 内核调试器。 使用复选框允许这两个应用程序通过防火墙。 (WinDbg 或 KD) 重启调试应用程序。

加密密钥

若要确保目标计算机的安全,必须在主机和目标计算机之间传输的数据包进行加密。 强烈建议在配置目标计算机) 时使用 bcdedit 提供的自动生成的加密密钥 (。 网络调试使用一个 256 位密钥,该密钥指定为四个 64 位值,以 36 为底,以句点分隔。 每个 64 位值最多使用 13 个字符来指定。 有效字符是字母 a 到 z,数字 0 到 9。 不允许使用特殊字符。

若要指定自己的密钥,请在目标计算机上打开提升的命令提示符窗口。 输入以下命令,其中 w.x.y.z 是主计算机的 IP 地址, n 是端口号, 密钥 是密钥:

bcdedit /dbgsettings net hostip:w.x.y.z port:n key:Key

每当 dbgsettings 发生更改时,都需要重新启动目标计算机。

故障排查提示

必须允许通过防火墙调试应用程序

首次尝试建立网络调试连接时,系统可能会提示你允许调试应用程序 (WinDbg 或 KD) 通过防火墙进行访问。 Windows 的客户端版本会显示提示符,但 Windows 的服务器版本不显示提示。 应通过选中 所有三 种网络类型的框来响应提示:域、专用和公用。 如果未收到提示,或者在提示可用时未选中复选框,则必须使用 控制面板 允许通过防火墙进行访问。 打开控制面板>系统和安全,然后选择“允许应用通过 Windows 防火墙”。 在应用程序列表中,找到 Windows GUI 符号调试器和Windows 内核调试器。 使用复选框允许这两个应用程序通过防火墙。 向下滚动并选择“ 确定”以保存防火墙更改。 重启调试程序。

端口号必须在网络策略允许的范围内

可用于网络调试的端口号范围可能受公司网络策略的限制。 若要确定公司的策略是否限制可用于网络调试的端口范围,请与网络管理员联系。 在目标计算机上,以管理员身份打开命令提示符窗口,并输入命令 bcdedit /dbgsettings。 输出将与此类似。

C:\> bcdedit /dbgsettings
key                     XXXXXX.XXXXX.XXXXX.XXXXX
debugtype               NET
hostip                  169.168.1.1
port                    50085
dhcp                    Yes
The operation completed successfully.

在前面的输出中,端口的值为 50085。 如果端口的值超出了网络管理员允许的范围,请输入以下命令,其中 w.x.y.z 是主计算机的 IP 地址, 而 YourDebugPort 是允许范围内的端口号。

bcdedit /dbgsettings net hostip:w.x.y.z port:YourDebugPort

更改目标计算机调试器设置后,使用新端口设置在主机上重新运行调试器,然后重新启动目标计算机。

使用 Ping 测试连接

如果调试器未连接,请在目标电脑上使用 ping 命令来验证连接性。

C:\>Ping <HostComputerIPAddress>

请注意,如果主机未配置为在网络上可发现,则可能不起作用,因为防火墙可能会阻止 ping 请求,因此,在 ping 主机时不会收到任何响应。

调试器如何获取目标计算机的 IP 地址

目标计算机上的 KDNET 尝试使用动态主机配置协议 (DHCP) 来获取用于调试的网络适配器的可路由 IP 地址。 如果 KDNET 获取 DHCP 分配的地址,则位于网络上任意位置的主计算机可以调试目标计算机。 如果 KDNET 无法获取 DHCP 分配的地址,它将使用自动专用 IP 寻址 (APIPA) 来获取本地链接 IP 地址。 本地链接 IP 地址不可路由,因此主机和目标无法使用本地链接 IP 地址通过路由器进行通信。 在这种情况下,如果将主机和目标计算机插入同一网络中心或交换机,网络调试将正常工作。

在使用基于 PCI 的 NIC 的物理计算机上设置 KDNET 时,请始终指定 busparams

如果使用基于 PCI 或 PCIe 的 NIC 在物理计算机上设置 KDNET,应始终指定要用于 KDNET 的 NIC 的总线参数。 若要指定总线参数,请打开设备管理器,并找到要用于调试的网络适配器。 打开网络适配器的属性页,记下“常规”选项卡上的“位置”下显示的总线编号、设备编号和函数编号。在提升的命令提示符窗口中,输入以下命令,其中 bdf 是十进制格式的总线、设备和函数编号:

bcdedit /set "{dbgsettings}" busparams b.d.f

当调试器在主机上运行并等待连接时,请使用此命令重新启动目标计算机。

shutdown -r -t 0

手动删除 BCDEdit 条目

通常不需要手动删除,但此处提供了针对异常情况的故障排除过程。

使用 kdnet 实用工具时,不需要手动删除条目。 有关详细信息,请参阅 自动设置 KDNET 网络内核调试

使用 bcdedit –deletevalue 时,必须提供有效的 bcd 元素名称。 有关详细信息,请参阅 BCDEdit /deletevalue

若要手动删除 BCDEdit 条目,请完成以下步骤。

  1. 在目标计算机上,以管理员身份打开“命令提示符”窗口。

  2. 例如,输入此命令以删除主机 IP 地址的 BCDEdit 调试条目。

    bcdedit -deletevalue {dbgsettings} hostip
    

删除 hostip 时,需要在调试器命令行上指定 target=

  1. 另一个示例是使用此命令删除端口条目。

    bcdedit -deletevalue {dbgsettings} port
    

删除端口条目时,KDNET 将使用默认的 能注册 能调试器端口 5364。

Hyper-V

设置 Hyper-V

如果打算在目标计算机上安装 Hyper-V 角色,请参阅 设置虚拟机主机的网络调试

有关调试 hyper-v 虚拟机 (VM) 的信息,请参阅 设置虚拟机的网络调试 - KDNET

在运行具有外部网络连接的 VM 的 hyper-v 主机上启用 KDNET

有一种情况,这种情况并不常见,这将导致 VM 中的网络停止工作:

  • 已在电脑上启用 Hyper-V,已创建外部网络交换机,并指向计算机中的物理 NIC,并且 VM 已配置为使用该外部交换机进行网络。

  • 然后,将使用外部网络交换机指向的相同物理 NIC 在 hyper-v 主机操作系统上启用 KDNET,并重新启动主机。

  • 使用以前配置的外部交换机的所有 VM 在重启后会失去网络连接。

这是设计造成的,这是因为 KDNET 独占控制它配置为使用的 NIC,并且 OS 不加载该 NIC 的本机 NDIS 微型端口。 发生这种情况时,外部网络交换机无法再与本机 NDIS 微型端口驱动程序通信,并且将停止工作。 若要解决此问题,请执行以下操作:

  1. 从 Hyper-V 管理器打开虚拟交换机管理器,选择现有的虚拟交换机,然后从下拉框中选择外部网络 NIC,然后在“虚拟交换机管理器”对话框中选择“确定”,将外部网络 NIC 更改为 Microsoft 内核调试网络适配器

  2. 更新虚拟交换机 NIC 后,请关闭并重启 VM。

关闭 KDNET 调试后,需要遵循相同的过程,将外部交换机重新指向 NIC 的本机 NDIS 微型端口。 否则,在禁用调试后重启计算机时,VM 连接将丢失。

IPv6

Windows 版本 1809 中添加了 IPv6 支持。

若要将 IPv6 与调试器配合使用,请完成以下步骤。

  1. Ping debughostname<>,并记下输出行“回复”中报告的 IPv6 地址。使用此 IPv6 地址代替下面的 x:y:z:p:d:q:r:n。

  2. 使用 BCDEdit 删除 dbgsettings 中的任何现有 IP 地址值。

    bcdedit -deletevalue {dbgsettings} hostip
    
  3. 设置主机的 IPv6 地址。 字符串中 hostipv6=s:t:u:v:w:x:y:z 不得有任何空格。 <YourPort> 是用于此目标计算机的网络端口号, <YourKey> 是四部分安全密钥, <b.d.f> 是要用于 KDNET 的 NIC 的总线设备功能位置编号。

    bcdedit /dbgsettings net hostipv6:s:t:u:v:w:x:y:z port:<YourPort> key:<YourKey> busparams:<b.d.f>
    
  4. 键入此命令以确认 dbgsettings 已正确设置。

    C:\> bcdedit /dbgsettings
    busparams               0.25.0
    key                     2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    debugtype               NET
    hostipv6                  2001:db8:0:0:ff00:0:42:8329
    port                    50010
    dhcp                    Yes
    The operation completed successfully.
    
  5. 在主机上,使用此命令启动调试器。

    Windbg -k net:port=<yournetworkportnumber>,key=<key_output_from_kdnet>,target=::<YourIPv6Address> 
    
  6. 当调试器在主机上运行并等待连接时,重新启动目标计算机。

  7. 调试器应在启动期间提前连接到主机调试器。 你会知道 KDNET 正在使用 IPv6 连接,因为在连接的消息中报告的 IP 地址将是 IPv6 地址,而不是 IPv4 地址。

说明

  • 允许指定 hostip 的每个调试器 bcd 设置都有相应的 hostipv6 元素。 有三个。

    IPv4 IPv6 使用情况
    hostip hostipv6 用于启动和内核调试
    targethostip targethostipv6 特定于内核调试
    hypervisorhostip hypervisorhostipv6 对于 hyper-v 调试
  • 如果为任一类型的调试设置 hostipv6 样式地址,则表示需要且将获得 IPv6。

  • 如果为任一类型的调试设置 hostip 样式地址,则表示需要且将获得 IPv4。

  • 目标将仅执行 IPv4 或 IPv6,而不是同时执行两者。 使用哪个版本的 IP 协议由目标计算机 dbgsettings 控制。 如果设置了 hostip,则目标将使用 IPv4。 如果设置了 hostipv6,则目标将使用 IPv6。

  • 主机调试器通常会自动选择 IPv4 或 IPv6 的使用。 默认情况下,调试器同时侦听 IPv4 套接字和 IPv6 套接字,并在其中一个套接字上自动连接到目标计算机。

  • 如果要在主机上的调试器中强制使用 IPv6,但希望调试器侦听来自目标的连接,则可以将 添加到 target=:: 调试器命令行。 :: 是 0 的 IPv6 地址。

  • 如果要在主机上的调试器中强制进行 IPv4 调试,但希望调试器侦听来自目标的连接,则可以将 添加到 target=0.0.0.0 调试器命令行。 0.0.0.0 是 IPv4 地址 0。

  • 如果在调试器命令行上指定 target= 并使用计算机名称,则调试器会将该计算机名称转换为 IPv4 地址和 IPv6 地址,并尝试在两者上连接。

  • 如果在调试器命令行上指定 target=,并使用 IP 地址,如果 IP 地址包含任何包含任何 : 字符,则调试器将假定它是 IPv6 地址,并将强制对该连接使用 IPv6。 如果 IP 地址包含任何 。 字符,调试器将假定它是 IPv4 地址,并将强制对该连接使用 IPv4。

  • 如果在目标上设置 IPv6,并在调试器命令行上强制使用 IPv4,则不会获得连接。

  • 如果在目标上设置 IPv4,并在调试器命令行上强制使用 IPv6,则也不会获得连接。

有关其他信息,请参阅这些主题。

自动设置 KDNET 网络内核调试

Windows 10 中的网络内核调试支持的以太网 NIC

Windows 8.1 中的网络内核调试支持的以太网 NIC