Hyper-V 仮想マシンへのネットワーク経由のカーネルデバッガ接続方法
Hyper-V 仮想マシンに仮想 COM ポート経由のカーネルデバッガ接続方法では、レスポンスが遅く感じられたことはありませんか?今回は、Hyper-V 仮想マシンへのネットワーク経由のカーネルデバッガ接続方法をご案内します。これにより、読者の方のデバッグの作業効率が上がれば幸いです。
今回は、例として、WinDbg を動作させるホストPC では Windows 10 1803 x64、カーネルデバッガを接続される仮想マシンではWindows 10 1803 x86 が動作しています。ホストPC 側には、WDK 10 1803 がインストールされているものとします。仮想マシンは、第一世代のものを使用しています。
-
- ホストPC と仮想マシンをネットワーク接続します。
仮想スイッチは、以下の図のように、以下の3点を満たす必要があります。
・外部ネットワーク
・「管理オペレーティングシステムにこのネットワークアダプターの共有を許可する」にチェック
・VLAN ID を無効
この仮想スイッチ(図の例では、External という名前にしています) を、仮想マシンのネットワークアダプタ―に設定しています。
-
- ホストPC のIP アドレスを確認します。
ホストPC 側でコマンドプロンプトを起動し、ipconfig を実行してIP アドレスを確認します。
>ipconfig
Windows IP 構成
イーサネット アダプター vEthernet (External):
...
IPv4 アドレス . . . . . . . . . . . .: <ホスト PC の IP アドレス>
... |
仮想マシン側でコマンドプロンプトを起動し、ping< ホストPC のIP アドレス> を実行して、Ping が通ることを確認します。
-
- 仮想マシン上に kdnet.exe と VerifiedNICList.xml をコピーします。
Kdnet.exe とVerifiedNICList.xml は、WDK 10 のインストールフォルダの下のDebuggers\<architecture> フォルダにあります。<architecture> フォルダは、x86, x64, arm のいずれかですが、仮想マシンの CPU アーキテクチャに一致するものを使用します。今回の例では、仮想マシンが x86 なので、ホストPC 上のC:\Program Files (x86)\Windows Kits\10\Debuggers\x86 のものを使用します。これらを、仮想マシン上の任意のフォルダにコピーします。今回は C:\kdnet フォルダを作成して、そこにコピーします。
-
- 仮想マシン上で管理者権限のコマンドプロンプトを実行し、以下のコマンドを実行します。
// cd コマンドで c:\kdnet にカレントディレクトリを移動します。 C:\Windows\system32>cd \kdnet
// オプションなしで kdnet.exe を実行すると、ターゲット PC の NIC がカーネルデバッガを接続するのに使用できるかどうかがわかります。 // 今回はターゲット PC が Hyper-V の仮想マシンなので、以下のように表示されます。 C:\kdnet>kdnet
Network debugging is supported by this Microsoft Hypervisor Virtual Machine.
// kdnet.exe <ホスト PC の IP アドレス> <ポート番号> を実行します。 // ポート番号は、50000 から 50039 の間の値を使用します。 // 今回の例では 50010 を使用します。 // これにより、ネットワーク経由のカーネルデバッガ接続のための、仮想マシン側の設定が完了し、次のアクションの指示が表示されます。 C:\kdnet>kdnet XXX.XXX.XXX.XXX 50010
Enabling network debugging on Microsoft Hypervisor Virtual Machine. Key=31oes04t2njsd.rudxy2apusd.2rad4d7rox9q4.1gjwywsdyiosm
To debug this vm, run the following command on your debugger host machine. windbg -k net:port=50010,key=31oes04t2njsd.rudxy2apusd.2rad4d7rox9q4.1gjwywsdyiosm
Then restart this VM by running shutdown -r -t 0 from this command prompt.
// デバッグ設定を確認します。 C:\kdnet>bcdedit /dbgsettings key 31oes04t2njsd.rudxy2apusd.2rad4d7rox9q4.1gjwywsdyiosm debugtype NET hostip XXX.XXX.XXX.XXX port 50010 dhcp Yes この操作を正しく終了しました。 |
-
- ホストPC 上で管理者権限のコマンドプロンプトを実行し、以下のコマンドを実行します。
// windbg.exe のあるディレクトリに移動します。 C:\WINDOWS\system32>cd "\Program Files (x86)\Windows Kits\10\Debuggers\x86"
// WinDbg をネットワーク経由でカーネルデバッガ接続します。 // windbg -k net:port=<ポート番号>,key=<key> // 手順4で表示された上記形式のコマンドをコピー&ペーストすると便利です。 C:\Program Files (x86)\Windows Kits\10\Debuggers\x86> windbg -k net:port=50010,key=31oes04t2njsd.rudxy2apusd.2rad4d7rox9q4.1gjwywsdyiosm |
コピー&ペーストするためには、以下の図のように、仮想マシンの[表示] の[拡張セッション] にチェックが入っていることを確認してください。
上記で windbg を実行すると、以下のようにファイアウォールのブロックを解除することを求められるので、ドメイン、プライベート、パブリックの3 つすべてにチェックを入れて、[アクセスを許可する] をクリックします。
WinDbg が接続を待機します。
-
- 仮想マシンを再起動します。
手順4 の仮想マシン上のコマンドプロンプトで、そのまま以下を実行します。
shutdown -r -t 0 |
すると、ホストPC 側のWinDbg に以下の通りブレークインしてきます。
-
- 参考文献
Setting Up Network Debugging of a Virtual Machine - KDNET
< /en-us/windows-hardware/drivers/debugger/setting-up-network-debugging-of-a-virtual-machine-host >
Setting Up KDNET Network Kernel Debugging Automatically
< /en-us/windows-hardware/drivers/debugger/setting-up-a-network-debugging-connection-automatically >
Kdnet.exe が、ホストPC がWindows 7 以降、ターゲットPC が Windows 8 以降であれば使えるとの記載があります。
The computer that runs the debugger is called the host computer, and the computer being debugged is called the target computer. The host computer must be running Windows 7 or later, and the
target computer must be running Windows 8 or later.
Debug Drivers - Step by Step Lab (Sysvad Kernel Mode)
< /en-us/windows-hardware/drivers/debugger/debug-universal-drivers--kernel-mode- >
上記の内容が、ドライバを開発される方のお役に立てば幸いです。
WDK サポートチーム 津田