Visual Studioを使ったネットワークカーネルデバッグの方法
こんにちは、JS です。
今回は、Visual Studio を使ったネットワーク接続でのカーネルデバッグについて、設定の手順を紹介したいと思います。
最近、シリアルポートがない PC が多いため、手軽に利用できるネットワークケーブルでのカーネルデバッグの接続方法に関するお問い合わせが増えております。WinDbg を使った方法は、すでに K 里さんが「ネットワークケーブルを用いたカーネルデバッグ接続の設定手順」で書かれているので、今回は Visual Studio で接続する方法をご案内したいと思います。MSDN ドキュメントにも、「Setting Up Kernel-Mode Debugging over a Network Cable in Visual Studio」の記事が用意されているので、併せてご確認いただければ幸いです。
主な手順は以下の 3 つになります。
1.環境の用意
2.Visual Studio 上での設定
3.デバッガーの動作確認
1.環境の用意
カーネルデバッグを行うためには、ホスト PC とターゲット PC の、2 台の PC が必要となります。参考として、私が使った環境を紹介したいと思います。
今回使用している OS は、ホスト・ターゲット共に Windows 8.1 Update (x64) となっています。そして、ホスト PC に Visual Studio 2013 と WDK 8.1 をインストールしています。
デバッグはネットワークケーブルを通して行う予定なので、両方の PC にネットワークカード(NIC)が組み込まれている必要があります。デバッグをサポートしていない NIC もありますので、以下の URL から、それぞれの PC に使われている NIC のハードウェア ID がサポートされているか確認します。
Supported Ethernet NICs for Network Kernel Debugging in Windows 8.1
https://msdn.microsoft.com/en-us/library/windows/hardware/dn337010(v=vs.85).aspx
ハードウェア ID はデバイスマネージャーから確認できます。手順は以下の通りです。
1) コントロールパネルを開き、 [ハードウェアとサウンド] > [デバイスマネージャー ] をクリック
2) デバイスマネージャーで、メニューから [表示] > [デバイス(種類別) ] を選択 。[ネットワーク アダプター ] の項目から使用したい NIC をダブルクリック
3) NIC のプロパティウィンドウが開くので、 [詳細 ] タブを押し、プロパティから [ ハードウェア ID] を選択
4) 値にある 「VEN_****」 と 「DEV_****」 の部分を URL のリストと照らし合わせる
例えば私の場合、ターゲット PC で使う NIC のハードウェア ID が PCI\VEN_8086&DEV_10F5… と表記されています。この場合、Vendor ID が8086 なので、URL の「Vendor ID 8086, Intel Corporation」の一覧を見ます。そして、Device ID は10F5 なので、同じ値がリストにあるか確認します。リストにあったので、この NIC はデバッグに使える、ということになります。
環境を確認した後は、PC 上での設定を行います。
・ ネットワーク探索、及び ファイルとプリンタの共有 を有効にします。コントロール パネルから [ ネットワークとインターネット] > [ネットワークと共有センター ] とクリックした後、 [共有の詳細設定の変更] から設定できます。
・ ホストとターゲットがお互いに(コンピューター名で)Ping できるか確認します。
・ ターゲット PC のアカウントが管理者権限を所持していることを確認します。パスワードも必要なので、ない場合は作りましょう。
以上の準備が整いましたら、次は Visual Studio の設定に移ります。
2.Visual Studio 上での設定
Visual Studio では、Provisioning という機能を使うことで、ホストから Visual Studio のインターフェースを通してターゲットにあるドライバのインストールやデバッグが可能になります。
WDK 8.1 で Provisioning を行うためには、ターゲット PC に WDK Test Target Setup というものをインストールしないといけません。セットアップファイルは WDK 8.1 のインストールディレクトリに含まれています。
例えばデフォルトの場合、以下のパスにファイルがあります:
C:\Program Files (x86)\Windows Kits\8.1\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
このファイルを(フラッシュドライブ等を使って)ターゲットの方に移してから実行します。これで準備はできました。
では、これから Provisioning の手順を説明します。
最初に、メニューバーの [DRIVER] > [Test] > [Configure Computers...] を順にクリックします。"Configure remote computers" ボタン をクリックしても開きます。
上記の画面で Add New Computer をクリックしますと、以下のダイアログが表示されます。
Computer Name: の欄にターゲット PC の名前をいれた後、デバッガ設定方法として Provision computer and choose debugger settings を選択します。すると、以下の画面が現れます。
ここで、Connection Type で Network を選択します。他のパラメーターは自動的に設定されているので、特に変更する必要はありません。
空欄の Bus Parameters というのがありますが、これはターゲット PC にネットワークアダプターが複数ある場合、どのアダプターを使用するか決めるために入力する必要があります。正確には、ターゲット PC につながっているアダプターを [バス#].[デバイス#].[機能#] という形で入力します。パラメーターの確認は、デバイスマネージャーを開き、該当するアダプターのプロパティウィンドウを表示することでできます。
複数のネットワークアダプターがあって、どれがホスト PC に繋がってるか確認したいときは、以下の手順を踏みます:
1) 左下の Windows ロゴを右クリックして、 [ネットワーク接続 ] をクリック
2) ネットワークをリストアップしたウィンドウが出るので、接続されているネットワークを右クリックし、 [プロパティ ] をクリック
3) [ 接続の方法] に書かれているものが、デバッグに使われるアダプターの名前ですので、デバイスマネージャー上に同じアダプターが表示されていることを確認できます。
私の環境の場合、複数のアダプターがあるので、入力する必要があります。上記のウィンドウにある通り、デバッグ用アダプターのプロパティを開くと「PCI バス 0, デバイス 25, 機能 0」と書いてありますので、Bus Parameters に "0.25.0" と入力します。アダプターが一つしかない場合は何もする必要はないのでスキップしましょう。
次へ進みますと、接続が開始されます。アカウント情報を求められた場合は入力しましょう。
今までの各種設定が完了していない場合は、この時点で失敗します。例えば、WDK Test Target Setup をターゲットにインストールしていない場合は、アカウント情報を複数回要求された後、以下のようなダイアログが表示されます。
うまくいった場合は、機能の設定やインストールが行われます。再起動が何回か起きると思われますが、落ち着いて待ちましょう。再起動後、WDKRemoteUser というアカウント名でログインされているかと思います。
接続設定が終わりましたら、以下のウィンドウが表示されますので、次へ進みます。
最後に Summary が表示されます。
デバッガーの設定があっているか、ターゲット PC の方で確認します。管理者権限でコマンドプロンプトを開き、
bcdedit /dbgsettings
とコマンドを入力します。表示された情報が上記ウィンドウのものと同じかどうか、比べてみましょう。
同じでしたら、以上で Provisioning は完了となります。
ちなみに、先ほど「機能の設定やインストールが行われます」と書きましたが、詳細は以下のドキュメントにありますので、ご興味のある方は参照していただければと思います。
What happens when you provision a computer (WDK 8.1)
https://msdn.microsoft.com/en-us/windows/dn265576(v=vs.90).aspx
3.デバッガーの動作確認
これから、実際にデバッガーを使ってみます。
ターゲット PC のカーネルプロセスを見るので、Visual Studio のメニューバーから [デバッグ] > [プロセスにアタッチ… ] を選択します。
他にも、"アタッチ…" ボタン をクリックすることで設定ができます。
上のようなダイアログが出ますので、アタッチ先を指定します。トランスポートは Windows Kernel Mode Debugger、修飾子はターゲット PC 名を選択することで、目的のプロセスが出てきます。プロセスを選択して、 [アタッチ ] ボタンを押しましょう。
すると、Visual Studio に以下のようなウィンドウが現れます。
"Connected to target…" というメッセージが現れたら、接続に成功したことになりますので、まずは Break をしてみましょう。Ctrl + Break を入力するか、"すべて中断" ボタン を押すことでできます。
上のようなメッセージが出て、ターゲット PC が入力に反応しなくなったら、カーネルデバッグができるようになった、ということになります。
ちなみに、Provisioning を行うと、ターゲット PC ネットワークアダプターの詳細が変更したり、新しいアカウントが追加したりと、占拠しているような状態になります。設定を元に戻したいときは、まず Provisioning を解除する必要があります。
接続をしたときと同じように、 [DRIVER] > [Test] > [Configure Computers… ] でダイアログを表示させます。しかし、今回は Add New Computer ではなく、ターゲット PC 名を選択して Delete Computer のボタンを押します。
上のダイアログで Remove provisioning and delete computer を選択して次へ進むと、機能のアンインストールや削除が行われます。
もしこの先 Provisioning を行わないのであれば、ターゲット PC から WDK Test Target Setup を手動でアンインストールしましょう。
以上で、Visual Studio を使ったネットワークカーネルデバッグの設定についての説明を終わります。VS でデバイスドライバの開発を検討してる方や、VS で設定しようとしてもうまくいかないという方のお役に立てたらと思います。