ネットワーク経由の Windows インスタンスのカーネルデバッギング
Elastic Network Adapter (ENA) 用の KDNET 拡張モジュールは、Amazon Elastic Compute Cloud インスタンスの ENA を介してネットワーク経由で Windows カーネルデバッギングを可能にするハードウェアドライバーサポートレイヤーです。Windows デバッガー (WinDbg) で拡張モジュールを使用して、Windows を実行している EC2 インスタンスでカーネルレベルのデバッギングを実行できます。
カーネルデバッギングは、ブルースクリーンエラー (BSOD)、ドライバーの障害、EC2 Windows インスタンスの起動問題などの低レベルのオペレーティングシステムの問題の診断とトラブルシューティングに役立ちます。
内容
前提条件
作業を開始する前に、次の項目があることを確認します。
同じサブネット内の 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 ドキュメントの「Windows デバッガーのインストール
インストール後、PowerShell セッションで次のコマンドを実行して、デバッガーが動作していることを確認します:
windbgx
WinDbg ウィンドウが開くはずです。その場合、インストールは成功しているので、ウィンドウを閉じることができます。
ステップ 2: デバッグターゲットをセットアップする
注記
カーネルデバッギングがアクティブな場合、デバッギングセッションに使用される ENA デバイスはデバッガートラフィック専用です。デバッギング中にデバッグターゲットインスタンスでインターネットアクセスを維持する必要がある場合は、開始する前にインスタンスに 2 番目の 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 アドレスにマッピングします。これらの詳細は、EC2 → インスタンス → [インスタンス ID] → ネットワーク → ネットワークインターフェイスの AWS マネジメントコンソール で相互参照できます。これにより、特定のネットワークインターフェイス 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 ドキュメントの「IPv6 での KDNET のセットアップ」を参照してください。 -
port-number— デバッギングセッションに使用するポート。推奨範囲は 50000~50039 (例:50000) です。 -
encryption-key— デバッギング接続を暗号化するために使用される 256 ビットキー。ピリオドで区切られた 4 つの 64 ビット値として指定されます。各 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 コマンドラインリファレンス
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 インスタンスタイプ
モジュールは現在、Secure Boot が有効になっているインスタンスをサポートしていません。昇格された PowerShell セッションで Confirm-SecureBootUEFI を実行して、ステータスを確認できます。出力が True の場合、Secure Boot はアクティブです。「TPM」プレフィックスを持つ Amazon 提供のすべてのイメージでは、デフォルトで Secure Boot が有効になっていることに注意してください。
追加のメモ
デバッガーをターゲットインスタンスに接続する際に問題が発生した場合は、以下を確認してください:
-
必要な Windows Server ビルドバージョンや拡張モジュールの存在など、このガイドに記載されているすべての前提条件が満たされている。
-
両方のインスタンスにアタッチされたセキュリティグループは、設定されたデバッギングポートでそれらのインスタンス間のトラフィックを許可するように正しく設定されている。
-
ホストインスタンスの Windows ファイアウォールルールは、設定されたポート上の 2 つのインスタンス間のネットワークトラフィックをブロックしない。
その他のガイダンスについては、Microsoft ドキュメントの「KDNET ネットワークカーネルデバッギングを手動でセットアップする