Windows용 디버깅 도구는 USB를 통해 KDNET을 사용하여 USB 3.0 케이블을 통해 커널 모드 디버깅을 지원합니다. 이 문서에서는 이 전송 옵션을 구성하는 방법을 설명합니다.
디버거를 실행하는 컴퓨터를 호스트 컴퓨터라고 하며 디버깅 중인 컴퓨터를 대상 컴퓨터라고 합니다.
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 호스트 컨트롤러의 버스, 디바이스 및 함수 번호입니다. 버스, 디바이스 및 기능 번호는 10진수 형식이어야 합니다.
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를 사용하여 부팅 정보를 변경하기 전에, 테스트 PC에서 BitLocker와 보안 부팅 같은 Windows 보안 기능을 일시적으로 중단해야 할 수도 있습니다.
테스트가 완료되면 이러한 보안 기능을 다시 사용하도록 설정하고 보안 기능을 사용하지 않도록 설정하면 테스트 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 -kKDNET 유틸리티를 사용하는 것이 좋습니다. 이 도구는 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를 실행하는 경우 관리자 권한으로 WinDbg의 64비트 버전을 엽니다.
[파일] 메뉴에서 [커널에 연결]을 선택합니다. 커널 디버깅 대화 상자에서 Net 탭을 엽니다. 다음 정보를 입력하고 확인을 클릭합니다.
<port address>각 대상/호스트 쌍에 대해 고유하며 권장되는 범위인 50000-50039 내에 있는 값은 kdnet.exe 실행될 때 입력으로 제공되었습니다.<session key>kdnet.exe 실행될 때 생성되고 명령 출력에 해당 값이 표시된 w.x.y.z입니다.
WinDbg를 사용하여 명령줄 세션
명령 프롬프트 창에서 이 명령을 입력하여 WinDbg로 세션을 시작할 수도 있습니다.
Windbg /k NET:port=<port address>,key=<session key>
대상 컴퓨터 다시 부팅
디버거가 로드되고 준비되면 대상 컴퓨터를 다시 부팅합니다. PC를 다시 부팅하는 한 가지 방법은 관리자의 명령 프롬프트에서 명령을 사용하는 shutdown -r -t 0 것입니다.
대상 PC가 다시 시작되면 디버거가 자동으로 연결됩니다.
문제 해결
USB 디바이스가 인식되지 않음
디버그 케이블을 삽입할 때 텍스트 USB 디바이스가 인식 되지 않는 호스트에 창 알림이 표시되면 알려진 USB 3.1~3.1 호환성 문제가 발생할 수 있습니다. 이 문제는 디버그 케이블이 호스트의 USB 3.1 컨트롤러와 대상의 Intel(Ice Lake 또는 Tiger Lake) 3.1 USB 컨트롤러에 연결된 경우 디버그 구성에 영향을 줍니다.
자세한 내용 및 프로세서 모델 목록은 Ice Lake(마이크로프로세서) 또는 Tiger Lake(마이크로프로세서)를 참조하세요. 대상 컴퓨터의 프로세서 모델을 찾으려면 설정 앱을 열고 System then About으로 이동합니다. 프로세서 는 디바이스 사양에 따라 나열됩니다.
이 문제를 확인하려면 장치 관리자 열고 유니버설 직렬 버스 컨트롤러에서 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 드라이버가 디버그 디바이스를 검색하기 때문에 발생할 수 있습니다. 이러한 오류 메시지를 제거하려면 관리자 명령 프롬프트에서 대상 디바이스에 다음 레지스트리 항목을 만듭니다.
또한 이 설정을 사용하면 부팅 시 초기 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가 대상 PC에 설치된 경우 옵션을 설정하여 추가 안정성 및 성능 향상을 NO_KDNIC 달성할 수 있습니다.
bcdedit /set {current} loadoptions NO_KDNIC
추가 NO_KDNIC 는 선택 사항이며 대상에 WINDOWS에 대한 네트워크 액세스를 제공하기 위해 USB-이더넷 어댑터를 연결하는 추가 NIC, Wi-Fi 또는 USB 포트가 있는 경우에만 사용할 수 있습니다.
추가 NO_KDNIC 하면 kdnic.sys 드라이버(미니포트 타이머 기반 드라이버)가 KDNET 위에서 실행되지 않습니다. 즉, Windows TCP/IP 트래픽은 KDNET 전송을 통해 라우팅되지 않습니다. 그런 다음 KDNET 전송은 대상 KDNET과 호스트 디버거 간에 디버깅 관련 패킷을 라우팅하는 데만 사용할 수 있습니다.
이는 kdnic.sys 드라이버가 kdnet을 기반으로 실행 중일 때 영향을 받을 수 있는 네트워크 성능에 도움이 될 수 있습니다. 이 경우 대상은 절전 모드로 이동하지 않고 전원 드립 테스트를 방지하거나 RDP를 통해 대상에 액세스할 때 지연이 발생합니다. 이는 kdnic.sys 실행 중일 때 KDNET 인터페이스가 디버거 패킷과 Windows TCP/IP 네트워크 패킷을 모두 라우팅해야 하기 때문입니다.
호스트 USB 컨트롤러 자동 재설정
디버거가 이전에 실패한 USB 열거형으로 인해 발생할 수 있는 부딪힌 USB 스택 상태가 발생할 수 있습니다. 이렇게 하면 모든 설정이 올바르게 구성된 경우에도 디버거가 대상 컴퓨터에 연결하지 못합니다.
IC 시나리오에서는 부모 USB 컨트롤러를 사용하도록 설정하기\r수동으로 사용하지 않도록 설정하여 이 문제를 해결할 수 있습니다.
자동화된 테스트 랩과 같은 다른 시나리오에서는 이와 같은 수동 단계를 수행할 수 없습니다.
설정을 사용하도록 설정 RestartKdNetUsbDebugDevice 하면 디버거 클라이언트는 실패한 USB 열거를 자동으로 모니터링하고 부딪힌 디바이스가 감지되면 USB 스택을 다시 설정합니다. 이렇게 하면 사용자 개입 없이 디버거가 연결할 수 있습니다.
이 기능은 디버거 클라이언트 애플리케이션에 기본 제공되므로 디버거 클라이언트가 실행 중이고 설정을 사용하는 경우에만 활성화됩니다.
사용 방법:
옵션 1: 디버거 프롬프트에서 다음 명령을 실행합니다.
kd> dx Debugger.Settings.Debug.Advanced.RestartKdNetUsbDebugDevice=true
경고
USB 디버그 디바이스가 이미 열거에 실패하면 세션이 대상에 연결되고 대상에 침입하지 못하므로 기능 디버거 프롬프트에 액세스하지 못하는 경우 이 전략을 사용하여 옵션을 설정하지 못할 수 있습니다.
옵션 2: (새) Windbg 애플리케이션에서 "파일" -> "설정" -> "커널 디버깅 설정"으로 이동하고 "필요한 경우 호스트 USB 컨트롤러의 자동 재설정 사용" 확인란을 클릭한 다음 "커널에 연결" 대화 상자에서 정상적으로 시작합니다.
옵션 3: 설정을 포함 RestartKdNetUsbDebugDevice 하도록 config.xml 파일을 만들거나 수정합니다. config.xml 파일은 디버거 클라이언트 애플리케이션(예: kd.exe 또는 (레거시) windbg.exe동일한 디렉터리에서 로드됩니다. 존재하지 않는 경우 다음 내용으로 config.xml이라는 새 파일을 만듭니다.
<?xml version="1.0" encoding="utf-8"?>
<Settings Version="2">
<Namespace Name="Debug">
<Namespace Name="Advanced">
<Setting Name="RestartKdNetUsbDebugDevice" Type="VT_BOOL" Value="true"></Setting>
</Namespace>
</Namespace>
</Settings>
config.xml 이미 있는 경우 xml 요소를 기존 xml 문서의 노드에 Debug.Advanced 병합 <Setting Name="RestartKdNetUsbDebugDevice" Type="VT_BOOL" Value="true"></Setting> 합니다.