シリアルケーブルでのカーネルモードデバッグ設定手順

ユーザーモードのアプリケーションやドライバを開発しているからと言って、カーネルモードのデバッグをする必要がないと思っていませんか?

 

皆さん、こんにちは。WDK サポートチームの津田です。ユーザーモードのアプリケーションやドライバを開発していても、例えば、以下のようなトラブルシューティングのシナリオに遭遇することがございます。これらのシナリオのように一見カーネルモードのデバッグが必要ないように思われる件でも、必要に応じてカーネルモードのデバッグの設定をお願いすることがございます。

 

・ 一般的な CreateFile/ReadFile/WriteFile/DeviceIoControl 等の Win32 API が期待通りの動作をせず、エラーを返す場合

→ カーネルモードで I/O マネージャが I/O リクエストパケット (IRP) に変換し、カーネルモードドライバーのスタックに送るので、その処理過程をライブデバッグする必要がある場合があります。

 

・ スプーラサービスのように、Remote Procedure Call (RPC) で他のプロセス B からプロセス Aの関数が呼ばれた結果、ご自身のアプリケーションがプロセス A から API で取得する値が期待通りにならない。RPC の呼び出し元のプロセス B が何かを特定したい場合

→ ユーザーモードデバッガで、プロセス A においてRPC の呼び出しが行われた呼び出し先の関数にブレークポイントを貼ります。現象再現時、ここにブレークします。その状態で、カーネルデバッガからブレークインすることで、他の全てのプロセスの各スレッドのコールスタックから、該当関数を呼び出しているものを確認します。これにより呼び出し元のプロセス B を確認できます。

 

・ 何らかのプロセスが、COM ポートなど特定のデバイスをオープンしているために、ご自身のアプリケーションはオープンできない。そのプロセスを特定したい場合

→ 当該デバイスのドライバの IRP_MJ_CREATE コールバック関数でブレークポイントを貼り、再現させてブレークインすれば、どのプロセスでそのオープンが行われているか確認できる可能性があります。(システムスレッド経由など、複数のプロセスをまたがっていたりすると、もう少し調査が必要です。)

 

そこで、今回は、これまでカーネルモードのデバッグをする機会がなかった皆様のために、シリアルケーブルでのカーネルモードデバッグ設定手順をご案内いたします。大まかな流れは以下のようになりますが、それぞれのステップを図入りで解説します。

 

1. ホスト PC とターゲット PC の準備

2. ホスト PC とターゲット PC をクロス シリアルケーブルで接続

3. ターゲット PC のデバッグポートとボー レートを設定

4. ホスト PC に WinDbg をインストール

5. WinDbg を起動しカーネルデバッグセッションを開始

 

 

1. ホスト PC とターゲット PC の準備

 

ホスト PC とターゲット PC とは、以下の図のように、WinDbg 等のカーネルデバッガをインストールする PC を「ホスト PC」、カーネルデバッグされる対象の PC を「ターゲット PC」と呼びます。これらの間は、ケーブルで接続します。ケーブルを接続するインターフェースの種類や、それぞれの接続方法は、先日の石沢さんの記事 (Kernel Debugger 接続インターフェース) で紹介しています。

 

clip_image004

 

 

2. ホスト PC とターゲット PC をクロス シリアルケーブルで接続

 

ホスト PC とターゲット PC をクロス シリアルケーブルで接続します。今回は、例として、以下の図のように、ホスト PC とターゲット PC 両方の COM 1 に接続します。利用可能なボー レート (baud rate) は以下の図の通りですが、推奨である 115200 を使用します。

 

clip_image006

 

3. ターゲット PC のデバッグポートとボー レートを設定

 

以下の手順を実施します。

 

clip_image002 管理者権限のコマンドプロンプトで以下を実行

> msconfig [Enter]

clip_image002[1] 「システム構成」ウィンドウ

clip_image002[2] [ブート]タブ→[詳細オプション]

clip_image002[3] 「ブート詳細オプション」ウィンドウ

• [デバッグ]にチェック

• [デバッグポート]にチェック

• ドロップダウンリストで「COM1:」を選択

• [ボー レート]にチェック

• ドロップダウンリストで「115200」を選択

 

Windows 10 をターゲット PC の例にした場合、画面としては、以下のようになります。

 

clip_image008

 

4. ホスト PC に WinDbg をインストール

 

私の前回の記事 (デバッガ (WinDbg) をインストールする) をご参照ください。

 

5. WinDbg を起動しカーネルデバッグセッションを開始

 

上記の手順の結果、WinDbg が起動している状態であることを前提とします。

 

[File]→[Kernel Debug] とクリックし、[COM] タブを以下のように設定します。

 

clip_image010

 

clip_image012

 

上記の Kernel Debugging ウィンドウで [OK] を押します。Save information for workspace? のポップアップが出る場合はYes/Noどちらでも構いません。WinDbg の Commandウィンドウに以下が表示されます。

 

Opened \\.\com1

Waiting to reconnect...

 

ターゲットOSを再起動して、Commandウィンドウに以下が表示されたら接続されたことを表します。

 

Kernel Debugger connection established.

 

 

以上の手順がお役に立てれば幸いです。

 

- 参考文献

 

Setting Up Kernel-Mode Debugging over a Serial Cable Manually

https://msdn.microsoft.com/en-us/library/windows/hardware/ff556867(v=vs.85).aspx