SCIENCE PARK

  1. ホーム
  2. デバイスドライバー開発
  3. デバドラ講座
  4. デバイスドライバ講座(中級)

デバドラ講座

【デバドラ講座2(中級) : カーネルモードへのデバッグ】

この講座ではWinDbgを使ってカーネルモードのデバッグをしていきます。
カーネルモードはPCのすべてのハードウェアに対して直接アクセスできる権限を持つモード(デバドラ講座8参照)です。
そのため、WinDbgを使ってカーネルデバッグするためには、デバッグを行うホストPCとデバッグ対象となるターゲットが必要となります。
(前者をDebugger、後者をDebuggeeと言います)
ここではその対象となるターゲットを仮想マシン(VM)として代用していきます。(図1)


(図1:ホストPCとターゲット)

仮想マシンの準備

今回は仮想マシン上にWindowsを準備していることを前提に、物理PCは一台でシリアルポート接続によるカーネルデバッグを行います。
仮想マシンは代表的なものであればどれをご用意いただいても問題ありません。(「Hyper-V」「VirtualBox」「VMware」等)

今回はCOMによる接続により行っていますが、他に以下の接続方法があります。

  • NET接続(Windows8以降で接続可能、カーネルデバッグではこちらが推奨されている)
  • USB接続(Windows7以降で接続可能)
  • IEEE1394接続<

仮想マシンのシリアルポート設定

シリアルポート接続を行うために仮想マシン自体のシリアルポートを名前付きパイプを公開する必要があります。
使用する仮想マシンごとに参考URLをご参考に設定ください。

◆各仮想マシンの設定の参考URL

仮想マシンのOS設定でシリアルポートがない場合はハードウェアのシリアルポートを追加します。
これにより仮想マシンとWinDbgを実行しているホストPC間で通信を行います。
名前付きパイプ(Namedpipe)には適当なパス名(ここでは「\\.\pipe\com_1」)を入力します。

Windowsのデバッグ設定

デバッグ対象となるWindows OSはデバッグ可能となるように設定されている必要があります。
以下の手順で、シリアルポート接続可能なように設定を行ってください。

1. システム構成のブートの詳細オプションを開く。(図2)

ファイル名を指定して実行("Windowsキー + R"を押下)から"msconfig"を実行し、システム構成を開きます。

(図2:仮想マシンのシステム構成)

2. デバッグ設定を行う

ブート詳細オプションが開いたら、デバッグにチェックを入れ、グローバルデバッグ設定のデバッグポートにチェックを入れ適当なCOMポートを選択します。
ここではCOM2となっていますが、仮想マシンの設定によってはどのCOMに接続されるかが異なりますので、別途確認を行うか順に試してみてください。
続いてボーレートにチェックし「115200」と入力します。(図3)

(図3:仮想マシンのブート詳細設定)

3. 再起動を行う

設定を適用するためにはOSの再起動を行う必要があります。

CUIによる設定方法

前述の再起動前に行う設定操作はコマンドプロンプトからコマンドを実行することでも実施可能です。(※管理者権限が必要です。)

デバッグ設定をONにするコマンド :bcdedit /debug on

シリアルポートを設定するコマンド:bcdedit /dbgsettings serial debugport:2 baudrate:115200

仮想マシンとWinDbgの接続方法

デバッグ対象となる仮想マシンの設定が終わったら、次はいよいよWinDbgでカーネルデバッグを実行します。
まずはホストPCからインストール済みのWinDbgを実行し、以下の手順で操作を実施してみましょう。

1. WinDbgのFileタグからKernel Dubug ... を選択します。
2. COMタグを選択しBaud Rateに「115200」、Portに「\\.\pipe\com_1」と入力します。
3. PipeとReconnectにチェックをいれます。(図4)

    

(図4:WinDbg_Kernel Debugging )

これで仮想マシンとWinDbgの設定が完了しました。
ショートカットコマンド「Ctrl + (Pause)/Break」でブレイクしてから、適当なコマンド操作にてデバッグすることができます。(F5でブレイクの解除を行います。)

下図のようにコマンド入力ができるようになれば成功です。(図5)

まだターゲットとの接続ができていない状態ですと「Debuggee not connected」と表示されコマンド入力ができません。
また、接続が確立していてもデバッグ対象のOSが動作している場合はコマンド入力ができないため、同様にコマンドが入力できず「Debuggee is running...」と表示されます。

 (図5:ブレイク完了)

参考URL

・Hyper-vなどの仮想OSにWinDbgをアタッチする方法

https://blogs.msdn.microsoft.com/jpwdkblog/2009/03/18/hyper-vosWinDbg/

・「VirtualBox Windows Kernel Debugging Tips」(コマンドによる設定方法)

https://www.virtualbox.org/wiki/Windows_Kernel_Debugging

page up