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


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

 

皆さん、こんにちは。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

 

Skip to main content