シリアルケーブルでのカーネルモードデバッグ設定手順
ユーザーモードのアプリケーションやドライバを開発しているからと言って、カーネルモードのデバッグをする必要がないと思っていませんか?
皆さん、こんにちは。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 接続インターフェース) で紹介しています。
2. ホスト PC とターゲット PC をクロス シリアルケーブルで接続
ホスト PC とターゲット PC をクロス シリアルケーブルで接続します。今回は、例として、以下の図のように、ホスト PC とターゲット PC 両方の COM 1 に接続します。利用可能なボー レート (baud rate) は以下の図の通りですが、推奨である 115200 を使用します。
3. ターゲット PC のデバッグポートとボー レートを設定
以下の手順を実施します。
> msconfig [Enter]
• [デバッグ]にチェック
• [デバッグポート]にチェック
• ドロップダウンリストで「COM1:」を選択
• [ボー レート]にチェック
• ドロップダウンリストで「115200」を選択
Windows 10 をターゲット PC の例にした場合、画面としては、以下のようになります。
4. ホスト PC に WinDbg をインストール
私の前回の記事 (デバッガ (WinDbg) をインストールする) をご参照ください。
5. WinDbg を起動しカーネルデバッグセッションを開始
上記の手順の結果、WinDbg が起動している状態であることを前提とします。
[File]→[Kernel Debug] とクリックし、[COM] タブを以下のように設定します。
上記の 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