네트워크를 통해 Windows 인스턴스에 대한 커널 디버깅
Elastic Network Adapter(ENA)용 KDNET 확장성 모듈은 Amazon Elastic Compute Cloud 인스턴스의 ENA를 활용하여 네트워크를 통해 Windows 커널 디버깅을 활성화하는 하드웨어 드라이버 지원 계층입니다. Windows 디버거(WinDbg)와 함께 확장성 모듈을 사용하여 Windows를 실행하는 EC2 인스턴스에서 커널 수준 디버깅을 수행할 수 있습니다.
커널 디버깅을 사용하면 EC2 Windows 인스턴스에서 블루 스크린 오류(BSOD), 드라이버 장애 및 부팅 문제와 같은 하위 수준의 운영 체제 문제를 진단하고 해결할 수 있습니다.
내용
사전 조건
시작하기 전에 다음 항목이 준비되었는지 확인합니다.
동일한 서브넷에 있는 2개의 EC2 Windows 인스턴스:
-
디버그 호스트 인스턴스 - Windows 디버거(WinDbg)를 실행합니다.
-
디버그 대상 인스턴스 - 디버깅하려는 인스턴스입니다.
인스턴스 시작에 대한 자세한 내용은 Amazon EC2 시작하기 섹션을 참조하세요.
호스트 및 대상 인스턴스의 보안 그룹은 KDNET 디버깅에 사용되는 포트에서 인바운드 및 아웃바운드 UDP 트래픽(권장 범위: 50000~50039)을 허용해야 합니다. 이를 설정하는 가장 간단한 방법은 UDP 트래픽을 자체에서 소스로 허용하는 인바운드 규칙을 사용하여 보안 그룹을 생성한 다음 해당 보안 그룹을 두 인스턴스에 연결하는 것입니다. 자세한 내용은 Amazon VPC 사용 설명서의 보안 그룹 규칙을 참조하세요.
디버그 대상 인스턴스는 다음 Windows 버전 중 하나(또는 이상 버전)를 실행해야 합니다.
-
빌드 번호가 26100.7462인 Windows Server 2025(2025년 12월 패치)
-
빌드 번호가 26100.7309인 Windows 11 24H2
-
빌드 번호가 26200.7309인 Windows 11 25H2
참고
ENA용 KDNET 확장성 모듈은 Windows의 일부로 배포되며 Windows 월별 누적 업데이트를 통해서만 업데이트할 수 있습니다. 디버그 대상에 최신 Windows KB를 설치된 상태로 유지하여 최신 버전을 사용하는 것이 좋습니다.
모듈이 디버그 대상에 있는지 확인하려면 승격된 PowerShell 세션에서 다음 명령을 실행합니다.
Test-Path C:\Windows\system32\kd_02_1d0f.dll
명령이 True를 반환하면 모듈이 사용 가능한 것입니다.
1단계: 디버그 호스트에서 Windows 디버깅 도구 설치
PowerShell 세션에서 다음 명령을 실행하여 디버그 호스트 인스턴스에서 Windows 디버깅 도구를 설치합니다.
winget install microsoft.windbg
자세한 설치 지침은 Microsoft 설명서의 Install the Windows Debugger
설치 후 PowerShell 세션에서 다음 명령을 실행하여 디버거가 작동하는지 확인합니다.
windbgx
WinDbg 창이 열립니다. 열리면 설치가 성공한 것이고, 창을 닫을 수 있습니다.
2단계: 디버그 대상 설정
참고
커널 디버깅이 활성 상태이면 디버깅 세션에 사용되는 ENA 디바이스는 디버거 트래픽 전용입니다. 디버깅 중에 디버그 대상 인스턴스에서 인터넷 액세스를 유지해야 하는 경우 시작하기 전에 인스턴스에 두 번째 ENA를 연결합니다.
디버그 대상에서 승격된 PowerShell 세션을 열고 다음 단계를 사용하여 커널 디버깅을 구성합니다.
다음 명령을 실행하여 인스턴스에 연결된 ENA 어댑터의 버스, 디바이스 및 함수 번호를 나열합니다.
Get-NetAdapter -Physical | Where-Object -Property PnPDeviceID -Match -Value '^PCI\\VEN_1D0F&DEV_EC2[01]&' | Get-NetAdapterHardwareInfo | Select-Object InterfaceDescription, BusNumber, DeviceNumber, FunctionNumber | Format-List
인스턴스에 여러 ENA 어댑터가 연결된 경우 다음 명령을 사용하여 각 물리적 어댑터를 프라이빗 IP 주소에 매핑합니다. AWS Management Console EC2 → 인스턴스 → [인스턴스 ID] → 네트워킹 → 네트워크 인터페이스에서 이러한 세부 정보를 상호 참조할 수 있습니다. 그러면 대상이 지정된 디버깅을 위해 특정 네트워크 인터페이스 ID, 프라이빗 IP 및 보안 그룹을 OS 수준 어댑터에 연관시킬 수 있습니다.
Get-NetAdapter -Physical | Where-Object PnPDeviceID -Match '^PCI\\VEN_1D0F&DEV_EC2[01]&' | ForEach-Object { $adapter = $_ $hwInfo = $adapter | Get-NetAdapterHardwareInfo $ipInfo = Get-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex -AddressFamily IPv4 [PSCustomObject]@{ InterfaceDescription = $adapter.InterfaceDescription IPAddress = $ipInfo.IPAddress BusNumber = $hwInfo.BusNumber DeviceNumber = $hwInfo.DeviceNumber FunctionNumber = $hwInfo.FunctionNumber } } | Format-List
출력에서 디버깅하는 데 사용할 ENA 어댑터의 BusNumber, DeviceNumber 및 FunctionNumber 값을 기록해 둡니다.
다음 명령을 실행하여 커널 디버깅을 구성합니다. 자리 표시자 값을 사용자별 구성으로 바꿉니다.
bcdedit /debug on bcdedit /set loadoptions FORCEHVTONOTSHAREDEBUGDEVICE bcdedit /dbgsettings net hostip:host-private-ipport:port-numberkey:encryption-keybusparams:b.d.f
참고
다음 명령을 실행하여 기존 loadoptions를 확인합니다. 값이 반환되면 해당 문자열을 복사하고 여기에 ;FORCEHVTONOTSHAREDEBUGDEVICE를 추가합니다.
(bcdedit /enum) -match "loadoptions"
위치:
-
host-private-ip- 디버그 호스트 인스턴스의 프라이빗 IPv4 주소입니다. 인스턴스가 IPv6 전용 서브넷에서 시작되는 경우 KDNET에서 IPv6를 사용하는 방법에 대한 자세한 내용은 Microsoft 설명서의 Setting up KDNET with IPv6를 참조하세요. -
port-number- 디버깅 세션에 사용할 포트입니다. 권장 범위는 50000~50039(예:50000)입니다. -
encryption-key- 디버깅 연결을 암호화하는 데 사용되는 256비트 키로, 점으로 구분되는 64비트 값 4개로 지정됩니다. 각 64비트 값은 소문자 a~z 및 숫자 0~9만 사용하여 최대 13자로 입력할 수 있습니다. 특수 문자는 허용되지 않습니다. 암호화 키 예:1kdnet2keys3.4kdnet5keys6.7kdnet8keys9.10kdnet11ke. -
b.d.f- 디버깅에 사용되는bus.device.function형식(예:0.3.0)의 ENA 디바이스의 버스, 디바이스 및 함수 번호입니다.
작은 정보
Windows 부팅 프로세스를 디버깅하려면 다음 명령도 실행합니다.
bcdedit /bootdebug on
3단계: 디버그 호스트에서 디버깅 세션 시작
호스트에서 트래픽 디버깅을 허용하기 위해 WinDbg 애플리케이션 또는 특정 UDP 포트에 대한 방화벽 규칙을 생성할 수 있습니다.
옵션 1: WinDbg 애플리케이션 허용
다음 명령을 실행하여 WinDbg 실행 파일을 승인합니다.
$WinDbgxPath = "$env:LocalAppData\Microsoft\WindowsApps\WinDbgX.exe" New-NetFirewallRule -DisplayName "Allow Inbound KDNET Connection" -Action Allow -Program $WinDbgxPath
옵션 2: 특정 UDP 포트 허용
또는 커널 디버깅을 위해 구성된 포트로의 인바운드 UDP 트래픽을 허용할 수 있습니다. port-number를 사용자가 선택한 KDNET 포트로 바꿉니다.
$DebugPort =port-numberNew-NetFirewallRule -DisplayName "Allow Inbound KDNET Connection" -Direction Inbound -LocalPort $DebugPort -Protocol UDP -Action Allow
참고
방화벽 구성은 도메인 그룹 정책(GPO)에 의해 제한되거나 여기에 승격된 관리자 권한이 필요할 수 있습니다. 명령이 실패하면 네트워크 관리자에게 문의하세요.
디버그 대상 구성과 일치하는 포트 및 키로 WinDbg를 시작합니다. 사용 사례에 맞게 Microsoft WinDbg command line reference
windbgx -k net:port=port-number,key=encryption-key
WinDbg가 열리고 디버그 대상이 연결될 때까지 기다립니다.
4단계: 디버그 대상 재부팅
디버그 대상에서 인스턴스를 다시 시작하여 디버깅 연결을 시작합니다.
shutdown -r -t 0
디버그 대상이 다시 시작되면 디버그 호스트의 WinDbg가 대상에 자동으로 연결됩니다. 이제 WinDbg를 사용하여 커널 상태를 검사하고, 중단점을 설정하며, 문제를 진단할 수 있습니다.
디버깅 후 디버그 설정 정리
디버그 대상에서
디버깅을 완료한 후 디버그 대상에서 커널 디버깅 구성을 제거하여 정상적인 부팅 동작을 복원합니다. 디버그 대상에서 승격된 PowerShell 세션을 열고 다음 명령을 실행합니다.
bcdedit /debug off bcdedit /dbgsettings LOCAL bcdedit /deletevalue loadoptions
FORCEHVTONOTSHAREDEBUGDEVICE 이외의 기존 loadoptions가 있는 경우 원래 loadoptions로 bcdedit /set loadoptions를 실행하여 설정을 복원해야 합니다.
부팅 디버깅을 활성화한 경우 다음도 실행합니다.
bcdedit /bootdebug off
변경 사항을 적용하려면 인스턴스를 다시 시작합니다.
디버그 호스트에서
다음을 실행하여 방화벽 규칙을 제거합니다.
Remove-NetFirewallRule -DisplayName "Allow Inbound KDNET Connection"
제한 사항
ENA용 KDNET 확장성 모듈은 현재 다음을 지원하지 않습니다.
-
8세대 비금속 x86_64 인스턴스 유형(예:
m8a.xlarge) -
7세대 48xlarge 비금속 x86_64 인스턴스 유형(예:
m7a.48xlarge) -
u7i 인스턴스 유형
모듈은 현재 보안 부팅이 활성화된 인스턴스를 지원하지 않습니다. 승격된 PowerShell 세션에서 Confirm-SecureBootUEFI를 실행하여 상태를 확인할 수 있습니다. 출력이 True인 경우 보안 부팅이 활성화됩니다. 'TPM' 접두사가 있는 모든 Amazon 제공 이미지에서는 기본적으로 보안 부팅이 활성화되어 있습니다.
추가 참고 사항
디버거를 대상 인스턴스에 연결하는 중 문제가 발생하면 다음을 확인합니다.
-
필요한 Windows Server 빌드 버전 및 확장성 모듈의 존재를 포함하여 이 가이드에 나열된 모든 전제 조건이 충족됩니다.
-
두 인스턴스 모두에 연결된 보안 그룹은 구성된 디버깅 포트에서 두 인스턴스 간 트래픽을 허용하도록 올바르게 구성됩니다.
-
호스트 인스턴스의 Windows 방화벽 규칙은 구성된 포트에서 두 인스턴스 간 네트워크 트래픽을 차단하지 않습니다.
추가 지침은 Microsoft 설명서의 Set up KDNET network kernel debugging manually