Hyper-VでWindbg!Windowsのカーネルデバッグ環境構築

開発
mohamed HassanによるPixabayからの画像

※この記事にはプロモーションが含まれています。

アプリケーション開発時にデバッグは必要不可欠ですが、ユーザーモードデバッグでは対処が難しい場合があります。今回は、KDNETモジュールを用いたHyper-V仮想マシンとホストとのカーネルデバッグ環境構築方法を紹介します。

スポンサーリンク
スポンサーリンク

はじめに

ユーザーモードデバッグが難しい場合として、以下の様な状況が挙げられます。

  • 開発中とは別のアプリやプロセスに処理が移った時に問題が発生した状態
  • Windowsカーネルに処理が移った時に問題が発生した状態
  • 対象アプリやプロセスをデバッグできない様な状態

この様な状況下では、カーネルデバッグができると問題あるプロセスまたはリソースなどを把握することができる場合があります。カーネルデバッグでは、得られる情報量が少なく、またローレベルにはなりますが、ユーザーモードでは得られない情報が入手出来て、問題解決に大変便利です。

準備

今回は、Windows 10上のHyper-VマシンにWindows 10をインストールして、ホストマシンと同じPC上でHyper-VマシンのゲストOSをカーネルデバッグします。ホスト・ゲストマシンに対し、下記を用意します。

  • ホストマシン
  • ゲストマシン
    • 仮想マシンの構築
      • 仮想スイッチマネージャー
        • 接続の種類:外部ネットワーク
        • 管理オペレーティングシステムにこのネットワークアダプターの共有を許可数る:有効
      • 仮想マシンの設定
        • 仮想VLAN IDを有効にする:無効
        • セキュリティブートを有効にする:無効

IPアドレスを確認する

ホストマシンでコマンドプロンプトを開き、下記コマンドでIPアドレスを確認します。

> IPConfig

ここでは、”192.168.1.20″であったとします。

ゲストマシンでコマンドプロンプトを開き、下記コマンドで通信可能であることを確認します。

> ping 192.168.1.20

ホストのモジュールをゲストにコピーする

ホストマシンの既定では以下のフォルダに存在する、kdnet.exeおよびVerifiedNICList.xmlを見つけます。

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

ゲストマシンにC:\KDNETフォルダを作成して、上記2ファイルをコピーします。

ゲストの環境を作成する

ゲストマシンで、管理者権限によりコマンドプロンプトを起動します。

コマンドプロンプトから、下記コマンドを実行し、ゲストマシンにプロセスがサポートしているネットワークアダプターが存在することを確認します。

> cd C:\KDNET
> kdnet.exe
Network debugging is supported by this Microsoft Hypervisor Virtual Machine

次に、ストマシン上で、ホストマシンのIPアドレスとポート番号(50000~50039の値)を指定して、一意の接続キーを生成します。

> kdnet.exe 192.168.1.20 50005

表示された”key=”の後に続く、長いキー文字列をコピーしておきます。

ホストからデバッガを接続する

ホストマシン上で、コマンドプロンプトから先ほど指定したポート番号および接続キーを用いて下記を実行します。

> cd "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\"
> windbg -k net:port=50005,key=<接続キー>

※ファイアフォール経由でアプリケーションのアクセス許可を求められた場合、ドメイン・プライベート・パブリックの3種類すべてを許可してください。

※keyの前に余計なスペースがあると、コマンドが正常に動作しません。

デバッガが起動したら、ゲストマシンにて下記コマンドで再起動します。

> shutdown -r -t 0

再起動が完了すると、ホストマシンのデバッガーに接続されます。接続後、Windbgのメニュー[Debug]-[Break]をクリックすることで、デバッグを開始することができます。

まとめ

カーネルデバッグを用いると、ユーザーデバッグでは対応できない環境でも問題点を検出できる場合があります。サービスモジュールにデバッグメッセージを吐き出させるだけでも、価値があります。

必要時に備えて、環境を構築しておくとスムーズにデバッグ作業に移れるので、問題解決に大いに役立つと思います。

以上、Hypver-V上の仮想マシンをカーネルデバッグする環境構築方法の紹介でした。

コメント