设置 KDNET USB 内核模式调试 (KDNET-USB)
Windows 调试工具支持通过 USB 3.0 电缆使用 KDNET 通过 USB 进行内核模式调试。 本文介绍如何配置此传输选项。
运行调试器的计算机称为主计算机,正在调试的计算机称为目标计算机。
通过 USB 3.0 电缆进行调试需要以下硬件:
- 在主计算机上,xHCI USB 3.0+ 主机控制器和 USB3 端口。
- 在目标计算机上,xHCI USB 3.0+ 主机控制器和支持调试的 USB3 端口(DBC)
- 目标计算机 USB 主机控制器必须支持 Intel xHCI 调试功能接口(DBC)。 有关详细信息,请参阅 Intel 网站上的 xHCI 规范。
二进制传输文件
kdstub.dll和kdnic.sys驱动程序用于支持 KDNET-USB 调试器传输。
电缆要求
橙色Microsoft USB 调试电缆,它是 A-A 交叉电缆,具有两个男性 A 型插入和无 Vbus 连接。 此电缆可供 DataPro - USB 3.0 超速 A/A 调试电缆等供应商使用。
将主机类型 A 端口连接到目标 C 端口需要标准 USB 3.0 类型 C 到类型 A 适配器。
为了简化故障排除,请直接在目标计算机和主计算机之间连接电缆,避免任何集线器或停靠站。
设置目标计算机
在目标计算机上,找到并启动 UsbView 工具。 UsbView 工具包含在 Windows 调试工具中。 对于 x64 系统,UsbView 将位于 C:\Program Files (x86)\Windows Kits\10\Tools\KitVersion\x64\usbview.exe中。
在 UsbView 中,找到所有 xHCI 主机控制器。
在 UsbView 中,展开 xHCI 主机控制器的节点。 查找主机控制器上的端口支持调试的指示。
[Port1] Is Port User Connectable: yes Is Port Debug Capable: yes Companion Port Number: 3 Companion Hub Symbolic Link Name: USB#ROOT_HUB30#5&32bab638&0&0#{...} Protocols Supported: USB 1.1: no USB 2.0: no USB 3.0: yes
记下要用于调试的 xHCI 控制器的总线、设备和函数编号。 UsbView 显示这些数字。 在以下示例中,总线号为 48,设备编号为 0,函数号为 0。
USB xHCI Compliant Host Controller ... DriverKey: {36fc9e60-c465-11cf-8056-444553540000}\0020 ... Bus.Device.Function (in decimal): 48.0.0
如果需要确认总线参数,请使用设备管理器。 在设备管理器中,找到要用于调试的 USB 控制器。 在“常规”选项卡上的“位置”下,将显示总线、设备和函数号。 b、 d 和 f 是 USB3 主机控制器的总线、设备和函数号。 总线、设备和功能编号必须采用十进制格式。
还可以使用kdnet.exe来帮助收集有关 USB 控制器的信息。
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64>kdnet Network debugging is supported on the following USB controllers: busparams=0.20.0, Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft) This Microsoft hypervisor supports using KDNET in guest VMs.
确定支持调试的 xHCI 控制器后,下一步是找到与 xHCI 控制器上的端口关联的物理 USB 连接器。 若要查找物理连接器,请将任何 USB 3.0 设备插入目标计算机上的任何 USB 连接器。 刷新 UsbView 以查看设备所在的位置。 如果 UsbView 显示连接到所选 xHCI 主机控制器的设备,则找到可用于 USB 3.0 调试的物理 USB 连接器。
重要
在使用 bcdedit
或kdnet.exe更改启动信息之前,可能需要暂时暂停测试电脑上的 Windows 安全功能,例如 BitLocker 和安全启动。
在已禁用这些安全功能的情况下,在测试完成后重新启用这些安全功能,并适当地管理测试 PC。
在建议的 50000-50039 范围内,为每个使用的目标/主机对选择唯
<port address>
一。 以下示例显示了 50005。在与 CPU 类型匹配的 WDK 调试器目录中找到KDNet.exe实用工具,例如 x64。
在目标计算机上,以管理员身份打开命令提示符窗口,并输入此命令以使用选项启用内核调试
-k
。 -w、-b 和 -h 将为 winload、bootmgr 和虚拟机监控程序系统应用程序启用内核调试。有关 WinDbg 选项的详细信息,请参阅 WinDbg - 命令行启动选项。kdnet.exe 169.254.255.255 50005 -k
- 169.254.255.255 不可路由的本地链路静态 IP 地址必须用于通过 USB3 的 KDNET。
- kdnet.exe将返回 WinDbg 用于连接到目标设备的密钥
w.x.y.z
。
若要使用特定的 USB 端口,请使用 -busparams 参数。
kdnet.exe -busparams 0.13.0 169.254.255.255 50005 -k
建议使用 KDNET 实用工具。 此工具设置使用 bcdedit 设置更复杂的选项,以及检查和设置支持 PCI 和电源管理的注册表值。
bcdedit /dbgsettings NET hostip:169.254.255.255 port:50001 key:1.2.3.4 busparams:0.20.0 noDhcp
禁用电源管理
在某些情况下,电源转换可能会干扰 USB 3.0 的调试。 若要避免这些问题,请为 xHCI 主机控制器及其根中心禁用选择性挂起,用于调试。
在设备管理器中,导航到 xHCI 主机控制器的节点。 右键单击节点,然后选择“ 属性”。 如果有电源管理选项卡,请打开该选项卡,并清除“允许计算机关闭此设备以保存电源”复选框。
在设备管理器中,导航到 xHCI 主机控制器根中心的节点。 右键单击节点,然后选择“ 属性”。 如果有电源管理选项卡,请打开该选项卡,并清除“允许计算机关闭此设备以保存电源”复选框。
使用 xHCI 主机控制器进行调试后,请为 xHCI 主机控制器重新启用选择性挂起。
使用 WinDbg 启动调试会话
将 USB 3.0 调试电缆连接到你选择用于在主机和目标计算机上调试的已识别 USB 3.0 端口。
在主计算机上,打开与在主计算机上运行的 Windows 的位数匹配的 WinDbg 版本(以管理员身份)。 例如,如果主计算机运行的是 64 位版本的 Windows,请以管理员身份打开 64 位版本的 WinDbg。
在 “文件 ”菜单上,选择“ 附加到内核”。 在“内核调试”对话框中,打开“ Net ”选项卡。输入以下信息,然后单击“ 确定”。
每个
<port address>
目标/主机对都是唯一的,在运行kdnet.exe时,建议的范围为 50000-50039。<session key>
运行kdnet.exe时生成的 w.x.y.z 及其值显示在命令输出中。
使用 WinDbg 的命令行会话
还可以通过在命令提示符窗口中输入此命令来启动与 WinDbg 的会话。
Windbg /k NET:port=<port address>,key=<session key>
重新启动目标计算机
加载调试器并准备好运行后,重新启动目标计算机。 重启电脑的一种方法是使用 shutdown -r -t 0
管理员命令提示符中的命令。
目标电脑重启后,调试器应自动连接。
故障排除
USB 设备无法识别
如果在插入调试电缆时无法识别文本 USB 设备的主机上显示 Windows 通知,则可能命中已知的 USB 3.1 到 3.1 兼容性问题。 当调试电缆连接到主机上的 USB 3.1 控制器和目标上的 Intel(Ice Lake 或 Tiger Lake)3.1 USB 控制器时,此问题会影响调试配置。
有关详细信息和处理器模型列表,请参阅 Ice Lake(微控制器)和老虎湖(微控制器)。 若要查找目标计算机的处理器模型,请打开“设置”应用,然后转到“系统” 处理器在设备规范下列出。
若要验证此问题,请打开设备管理器,并在通用串行总线控制器下查找 USB 调试连接设备。 如果找不到此设备,请在“其他设备”下检查未知设备。 右键单击设备以打开其属性页。 设备状态文本框将显示 Windows 已停止此设备的文本,因为它报告了问题(代码 43),USB 设备返回了无效的 USB BOS 描述符。
若要解决此问题,请从管理员命令提示符运行以下命令,对注册表进行更改:
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\349500E00000 /v SkipBOSDescriptorQuery /t REG_DWORD /d 1 /f
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\045E06560000 /v SkipBOSDescriptorQuery /t REG_DWORD /d 1 /f
直接编辑注册表时请谨慎,因为不正确的更改可能导致系统不稳定。
连接在调试器控制台窗口中重试消息,无法进入目标 - SkipPciProbeDebugDevice
如果在 KDNET 调试器控制台中遇到以下消息,则无法启动进入目标的中断,或者遇到某些命令(例如 kdfiles)的问题,则可能是因为 KDNET 接收了序列外 ping 数据包。
... Retry sending the same data packet for 128 times.
The transport connection between host kernel debugger and target Windows seems lost.
please try resync with target, recycle the host debugger, or reboot the target Windows.
此问题可能发生,因为pci.sys驱动程序正在探测调试设备。 若要消除这些错误消息,请在管理员命令提示符下在 TARGET 设备上创建以下注册表项。
如果初始 KD 传输在启动时无法连接,则此设置还可以允许调试器进行连接,原因有一些其他原因,例如在启动时无法配置调试设备。
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\SERVICES\kdnet /v SkipPciProbeDebugDevice /t REG_DWORD /d 1 /f
然后重启目标计算机。
shutdown /r /t 0
设备重新启动后,错误应消失,命令应按预期工作。
用于增强性能和可靠性的NO_KDNIC设置
如果在目标电脑上安装了以太网 NIC,可以通过设置 NO_KDNIC
选项来实现额外的可靠性和性能改进。
bcdedit /set {current} loadoptions NO_KDNIC
添加 NO_KDNIC
是可选的,仅当目标具有额外的 NIC、Wi-Fi 或 USB 端口来连接 USB 以太网适配器以提供对 Windows 的网络访问时,才能使用。
添加 NO_KDNIC
将阻止kdnic.sys驱动程序(基于微型端口计时器的驱动程序)在 KDNET 上运行,这意味着不会通过 KDNET 传输路由 Windows TCP/IP 流量。 然后,KDNET 传输只能用于在目标 KDNET 和主机调试器之间路由与调试相关的数据包。
这可以帮助解决kdnic.sys驱动程序在 kdnet 上运行时可能会受到影响的网络性能。 在这种情况下,目标永远不会进入睡眠状态,防止电源滴水测试,或者通过 RDP 访问目标时会发生延迟。 这是因为 KDNET 接口需要在运行kdnic.sys时路由调试器数据包和 Windows TCP/IP 网络数据包。