このメソッドとリモート デバッグの組み合わせ
カーネル デバッガーからユーザー モード デバッガーを制御し、同時にユーザー モード デバッガーをデバッグ サーバーとして使用すると便利な場合があります。
たとえば、ユーザー モード シンボルがシンボル サーバー上にある場合にはこの構成が便利です。 カーネル デバッガーからユーザー モード デバッガーを制御するための標準構成では、2 つのデバッガーの対話によって同期がわずかに中断し、それらの中断によってシンボル サーバー認証が妨げられる可能性があります。 ここで説明するより複雑な構成では、この問題を回避できます。
注 このシナリオの説明では、ターゲット アプリケーションは、デバッグ対象のユーザー モード アプリケーションを指します。ターゲット コンピューターは、ターゲット アプリケーションと CDB または NTSD のプロセスが存在するコンピューターを指します。ホスト コンピューターは、カーネル デバッガーが存在するコンピューターを指します。
この手法を使用するには、次の操作を行う必要があります。
ターゲット コンピューターで NTSD または CDB を起動し、-ddefer および -server コマンド ライン オプションを使用して必要なトランスポート オプションを指定します。 -server オプションは、コマンド ラインの最初のパラメーターである必要があります。
たとえば、次の構文を使用して、実行中のプロセスにアタッチできます。
ntsd -server ServerTransport -ddefer [-y UserSymbolPath] -p PID
または、次の構文を使用して、ターゲットとして新しいプロセスを開始することもできます。
ntsd -server ServerTransport -ddefer [-y UserSymbolPath] ApplicationName
これを事後デバッガーとしてインストールする場合は、次の構文を使用します。 -server パラメーターを含めて事後デバッガーをインストールするためには、レジストリを手動で編集する必要があることに注意してください。詳細については、「事後デバッグの有効化」を参照してください。
ntsd -server ServerTransport -ddefer [-y UserSymbolPath]
使用可能なトランスポート オプションの詳細については、「デバッグ サーバーのアクティブ化」を参照してください。
ターゲット コンピューターをデバッグするものとして、ホスト コンピューターで WinDbg または KD を起動しますが、実際にはターゲット コンピューターの処理を一時停止しないでください。 WinDbg を使用するには、次の構文を使用します。
windbg [-y KernelSymbolPath] [-k ConnectionOptions]
この手順の詳細については、「WinDbg (クラシック) を使用したライブ カーネル モード デバッグ」を参照してください
.
サーバーの起動に使用するのと同じトランスポート オプションを指定して、WinDbg または CDB をデバッグ クライアントとして起動します。 このデバッグ クライアントは、ホスト コンピューターまたは 3 つ目のコンピューターで実行できます。
cdb -remote ClientTransport
この手順の詳細については、「デバッグ クライアントのアクティブ化」を参照してください。
デバッガーが実行され、カーネル デバッガーに
Input>
プロンプトが表示されたら、.sleep (デバッガーの一時停止) コマンドを使用してデバッガーを一時停止し、ターゲット コンピューターを数秒間実行させます。 これにより、ターゲット コンピューターでリモート トランスポート プロトコルを処理する時間が与えられ、ユーザー モード リモート サーバーとリモート クライアントの間で接続が確立されます。
CDB をユーザー モード デバッガーとして使用する場合、CDB に関連付けられているコマンド プロンプト ウィンドウがロックされたままになり、デバッグ中は使用できなくなります。 NTSD を使用する場合、ターゲット コンピューター上で NTSD にプロセス ID が関連付けられている場合でも、追加のウィンドウは作成されません。
「モードの切り替え」のトピックで説明されている 4 つのモードとそれらの切り替え方法が、この組み合わせのシナリオに適用されますが、以下の点が異なります。
ユーザー モード デバッグには 2 つの異なるモードがあります。 ターゲット コンピューターが実行されているときは、他のすべてのリモート デバッグ セッションと同様、デバッグ サーバーはデバッグ クライアントによって制御されます。これは、リモート制御ユーザー モード デバッグと呼ばれます。 カーネル モード デバッガーがターゲット コンピューターの処理を一時停止し、
Input>
プロンプトが表示されているときは、ユーザー モード デバッガーはカーネル デバッガーによって制御されます。これは、カーネル制御ユーザー モード デバッグと呼ばれます。これらの 2 つのモードは同時に使用できません。 カーネル デバッガーがターゲット コンピューターの処理を一時停止しているときは、ユーザー モード デバッガーがアクティブである場合でも、ターゲット コンピューターはリモート トランスポート プロトコルを処理できません。したがって、ユーザー モード デバッガーは、この接続を通じてリモート入力を受信することはできません。
ユーザー モード シンボルがシンボル サーバー上にある場合は、デバッグ モードがリモート制御ユーザー モードである間に、シンボル アクセスを要求するデバッガー コマンドを発行する必要があります。
カーネル制御ユーザー モードのデバッグからリモート制御ユーザー モードのデバッグに切り替えるには、.sleep (デバッガーの一時停止) コマンドを使用します。 ユーザー モード デバッガーがスリープ コマンドから復帰すると、デバッグ モードはリモート制御ユーザー モードになります。
リモート制御ユーザー モード デバッグからカーネル モード デバッグに切り替えるには、
Input>
プロンプトから任意のコマンドを入力します。 このプロンプトが表示されていない場合は、カーネル モード デバッグに切り替えてから、g (移動) command at thekd>
プロンプトを使用します。
内部的には、-ddefer で開始されたユーザー モード デバッガーでは、デバッグ クライアントからの入力に対する優先順位が 1 番目であり、カーネル デバッガーからの入力に対する優先順位は 2 番目になります。 ただし、カーネル デバッガーが既にターゲット コンピューターの処理を一時停止しているときは、リモート接続が使用できないため、同時入力間で競合が発生することはありません。