设置 USB 3.0 xHCI 内核模式调试(KDUSB xHCI-DBC USB 3.0)

Windows 调试工具支持通过 USB 3.0 电缆进行内核模式调试。 本文介绍如何手动设置 USB 3.0 调试。

运行调试器的计算机称为主计算机,正在调试的计算机称为目标计算机

通过 USB 3.0 电缆进行调试需要以下硬件:

  • 在主计算机上,xHCI (USB 3.0) 主机控制器
  • 在目标计算机上,支持调试的 xHCI (USB 3.0) 主机控制器
  • 目标计算机 USB 主机控制器必须支持 Intel xHCI-Debug 功能接口(DBC)。 有关详细信息,请参阅 Intel 网站上的 xHCI 规范。

电缆要求

  • 橙色Microsoft USB 调试电缆,它是 A-A 交叉电缆,具有两个男性 A 型插入和无 Vbus 连接。 此电缆可供 DataPro - USB 3.0 超速 A/A 调试电缆等供应商使用。

为了简化故障排除,请直接在目标计算机和主计算机之间连接电缆,避免任何集线器或停靠站。

二进制传输文件

kdstub.dll用于支持 KDUSB xHCI-DBC USB 3.0 调试器传输。

设置目标计算机

  1. 在目标计算机上,启动 UsbView 工具。 UsbView 工具包含在 Windows 调试工具中。 对于 x64 系统,UsbView 将位于 C:\Program Files (x86)\Windows Kits\10\Tools\kitversion\x64\usbview.exe中。

  2. 在 UsbView 中,找到所有 xHCI 主机控制器。

  3. 在 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
    
  4. 记下要用于调试的 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
    
  5. 确定支持调试的 xHCI 控制器后,下一步是找到与 xHCI 控制器上的端口关联的物理 USB 连接器。 若要查找物理连接器,请将任何 USB 3.0 设备插入目标计算机上的任何 USB 连接器。 刷新 UsbView 以查看设备所在的位置。 如果 UsbView 显示连接到所选 xHCI 主机控制器的设备,则找到可用于 USB 3.0 调试的物理 USB 连接器。

重要

在用于 bcdedit 更改启动信息之前,可能需要暂时暂停测试电脑上的 Windows 安全功能,例如 BitLocker 和安全启动。 在已禁用这些安全功能的情况下,在测试完成后重新启用这些安全功能,并适当地管理测试 PC。

  1. 在目标计算机上,以管理员身份打开命令提示符窗口,并输入以下命令:

    bcdedit /debug on
    bcdedit /dbgsettings usb targetname:<TargetName>
    

    TargetName 是为目标计算机创建的名称。 请注意, TargetName 不必是目标计算机的正式名称;只要它满足以下限制,就可以创建的任何字符串:

    • 字符串不得在 TargetName 中的任何位置包含大写或小写组合中的“debug”。 例如,如果在目标名称中的任何位置使用“DeBuG”或“DEBUG”,则调试无法正常工作。
    • 字符串中唯一的字符是连字符(-)、下划线(_)、数字 0 到 9,以及字母 A 到 Z(大写或小写)。
    • 字符串的最大长度为 24 个字符。
  2. 在设备管理器中,找到要用于调试的 USB 控制器。 在“常规”选项卡上的“位置”下,将显示总线、设备和函数号。 输入以下命令:

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

    Bdf 是 USB 主机控制器的总线、设备和函数号。 总线、设备和功能编号必须采用十进制格式。

    示例:

    bcdedit /set "{dbgsettings}" busparams 48.0.0
    
  3. 重新启动目标计算机。

禁用电源管理

在某些情况下,电源转换可能会干扰 USB 3.0 的调试。 若要避免这些问题,请为 xHCI 主机控制器及其根中心禁用选择性挂起,用于调试。

  1. 在设备管理器中,导航到 xHCI 主机控制器的节点。 右键单击节点,然后选择“ 属性”。 如果有电源管理选项卡,请打开该选项卡,并清除“允许计算机关闭此设备以保存电源”复选框。

  2. 在设备管理器中,导航到 xHCI 主机控制器根中心的节点。 右键单击节点,然后选择“ 属性”。 如果有电源管理选项卡,请打开该选项卡,并清除“允许计算机关闭此设备以保存电源”复选框。

使用 xHCI 主机控制器进行调试后,请为 xHCI 主机控制器重新启用选择性挂起。

首次启动调试会话

  1. 将 USB 3.0 调试电缆连接到你选择用于在主机和目标计算机上调试的 USB 3.0 端口。
  2. 确定在主计算机上运行的 Windows 的位数(32 位或 64 位)。
  3. 在主计算机上,打开与在主计算机上运行的 Windows 的位数匹配的 WinDbg 版本(以管理员身份)。 例如,如果主计算机运行的是 64 位版本的 Windows,请以管理员身份打开 64 位版本的 WinDbg。
  4. 在“文件”菜单上,选择“内核调试”。 在“内核调试”对话框中,打开 “USB ”选项卡。输入在设置目标计算机时创建的目标名称。 单击“确定”。

此时,USB 调试驱动程序安装在主计算机上,这就是为什么将 WinDbg 的位数与 Windows 的位性相匹配非常重要。 安装 USB 调试驱动程序后,可以使用 32 位或 64 位版本的 WinDbg 进行后续调试会话。

启动调试会话

使用 WinDbg

在主计算机上打开 WinDbg。 在“文件”菜单上,选择“内核调试”。 在“内核调试”对话框中,打开 “USB ”选项卡。输入在设置目标计算机时创建的目标名称。 选择“确定”

还可以通过在命令提示符窗口中输入以下命令来启动与 WinDbg 的会话,其中 TargetName 是设置目标计算机时创建的目标名称:

windbg /k usb:targetname=<TargetName>

使用 KD

在主计算机上,打开命令提示符窗口并输入以下命令,其中 TargetName 是设置目标计算机时创建的目标名称:

kd /k usb:targetname=<TargetName>

重新启动目标计算机

连接调试器后,重新启动目标计算机。 重启电脑的一种方法是使用 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 设备上创建以下注册表项。

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\SERVICES\kdnet /v SkipPciProbeDebugDevice /t REG_DWORD /d 1 /f

然后重启目标计算机。

shutdown /r /t 0

设备重新启动后,错误应消失,命令应按预期工作。

另请参阅

手动设置内核模式调试

自动设置 KDNET 网络内核调试

手动设置 KDNET 网络内核调试

设置 USB KDNET EEM 内核模式调试 (KDNET-EEM-USB)

设置 USB KDNET 内核模式调试 (KDNET-USB)