Hyper-Vなどの仮想OSにwindbgをアタッチする方法

皆さん、こんにちは。A寿(えーひさ、とお読みください)です。突然ですが、皆さんは、石釜でピザを焼いたことがありますか?私は、数年前、仕事の関係で、ある飲み会に参加した際に、同じテーブルの方々が口々に「俺、ピザ焼いたことあるよ!」「ああ、俺もあるよ!」などと言われ、とても肩身の狭い思いをしたため、とあるイタリアンレストランのピザ教室にピザを焼きに行きました。ピザの生地を伸ばすところから体験しましたが、ピザの生地って外側に伸ばそうとすればするほど縮むんですよねー。結果、どんどん真ん中の生地が薄くなって、石釜で焼いたら真ん中から具が漏れて、石釜の中に残してきちゃいました。皆さんも、生地を伸ばす際はお気をつけください。

 

さて、さなえす さんからご紹介いただきましたように、私は比較的ストレージやファイルシステムの分野のお問い合わせを担当させていただくことが多いと思います。これらの分野のフィルタドライバの開発/デバッグ案件の中で、かつ物理的なデバイスを必要としない場合には、私は Windows Server 2008 の Hyper-V 上で、仮想 OS で再現環境を作成して、windbg をアタッチして調査することが多いです。この方法ですと、再現環境を作る際の、調査対象のドライバをインストールする前など、後で復元したい状態の仮想 OS のスナップショットを取っておくことで、いつでも好きな時点の環境に戻すことができ、異なるお問い合わせにも同じ仮想 OS がすぐに使用できるなど、重宝しております。

 

そこで、今回は、仮想OSにwindbgをアタッチする方法について、ご紹介したいと思います。仮想化環境として、今回は私が確認したのがHyper-Vであるため、Hyper-Vを例に説明していますが、VirtualServerやVirtualPCでも同様の設定が可能です。ご興味のある方はお試しください。また、Hyper-V や Virtual Server を使う人は、サーバーが離れていて、リモートで操作したい方がいらっしゃると思います。そんな方は、リモートデスクトップで Parent Partition もしくはホスト OS 側にログオンしてご利用ください。

 

1. 仮想OS側の設定

(1) 仮想 OS を起動し、仮想 OS の中で、シリアルポートを使用する場合と同様に、デバッグオプション、デバッグ ポート、ボー レートの設定を行います。

 

Vista 以降では例えば msconfig.exe を使用します。

(例えば、[スタート] の [検索の開始] から msconfig を入力して実行します。)

下記の画面のように、[ブート] タブを選択し、中段にある [詳細オプション] を選択します。

 

   

 

すると、ブート詳細オプション画面が表示されますので、下記の画面のように、[デバッグ] のチェックボックスをチェックし、[デバッグ ポート] をここでは "COM1"、[ボー レート] は "115200" と設定してください。

 

   

 

Server 2003 以前では、boot.ini にて、[operating systems] の下の適切な OS の行に

" /debug /debugport=COM1 /baudrate=115200"

を追加してください。

以下は、XP の場合の例です。[operating systems] の下の一行目がデバッガ接続可能な設定を表す行であり、二行目はデバッガの接続ができない(もとのままの)設定を表す行です。

  

[boot loader]

timeout=30

default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /debug /debugport=COM1 /baudrate=115200

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect

 

上記の設定が終われば、仮想 OS をシャットダウンします。

 

(2) 仮想 OS の設定で、名前付きパイプを設定します。

例えば、Hyper-V Manager 等の仮想 OS の管理ツール上で、windbg を接続したい仮想 OS を右クリックし、[Settings] を選択します。以下の画面のように、左側のペインで "COM1" を選択し、表示された右側のペインで [Named pipe] のラジオボタンを選択します。

 

   

 

そして、[Pipe name] に適当な名前を入力します。ここでは "com1" としておりますので、下の [Named pipe path] には、"\\.\pipe\com1" と表示されます。

 

2. Windbg側の設定

ここでは、Windows Server 2008 の Hyper-V の場合を扱いますので、WinDbg (Debugging Tools for Windows) は、Parent Partition である Windows Server 2008 にインストールされているとします。

(1) windbg.exe を管理者権限で起動します。(例えば、Windows Server 2008の [スタート] の [全てのプログラム] の [Debugging Tools for Windows] から WinDbg を選択します。)

(2) カーネルデバッグ設定で、ボー レートやポートの設定を行います。

WinDbgの[File]メニューから [Kernel Debug] を選択すると、Kernel Debugging ウィンドウが開きます。

そのウィンドウで、以下の画面のように、[COM] タブを選択し、下記を設定します。

・Baud Rate: 115200

・Port: \\.\pipe\com1

・Pipe と Reconnect にチェック

 

   

 

これで、Windbg は、次の画面のように、アタッチ先の仮想 OS の起動を待ちます。

 

 

 

この状態で、仮想 OS を起動すると、Windbg の Command ウィンドウにメッセージが出力され始めます。

これで、Windbg が仮想 OS にアタッチできたことになります。

Ctrl+Break などで OS の動きを停止して、デバッガのコマンドを実行したり、F5 で OS の停止を解除したり、できます。

 

 

Windbgの仮想 OS へのアタッチ方法についての説明は以上です。すでにご利用になっている方も多いかとは思いますが、もしまだ試されておらず、ご興味のある方は、お試しいただければ幸いです。