このメソッドとリモート デバッグの組み合わせ
カーネル デバッガー からユーザー モード デバッガーを
重要
リモート デバッグを使用する場合のセキュリティに関するその他の重要な考慮事項があります。セキュリティ モードの有効化の詳細については、「Security During Remote Debugging」および「Security Considerations for Windows Debugging Tools」を参照してください。
たとえば、この構成は、ユーザー モード シンボルがシンボル サーバー上にある場合に便利です。 カーネル デバッガーからユーザー モード デバッガーを制御するための標準構成では、2 つのデバッガーの対話によって同期が小さくて失われ、シンボル サーバー認証が妨げられることがあります。 ここで説明するより複雑な構成では、この問題を回避できます。
この手法を使用するには、次の操作を行う必要があります。
ターゲット コンピューターで 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 (クラシック) を使用したライブ Kernel-Mode デバッグ」を参照してください。
.
サーバーの起動に使用されるのと同じトランスポート オプションを使用して、WinDbg または CDB をデバッグ クライアントとして起動します。 このデバッグ クライアントは、ホスト コンピューターまたは 3 つ目のコンピューターで実行できます。
cdb -remote ClientTransport
この手順の詳細については、「デバッグ クライアントのアクティブ化
を参照してください。 デバッガーが実行され、カーネル デバッガーに
Input>
プロンプトが表示されたら、.sleep (デバッガーの一時停止) コマンドを使用してデバッガーを一時停止し、ターゲット コンピューターを数秒間実行させます。 これにより、ターゲット コンピューターでリモート トランスポート プロトコルを処理する時間が与えられます。これにより、ユーザー モードのリモート サーバーとリモート クライアントの間の接続が確立されます。
CDB をユーザー モード デバッガーとして使用する場合、CDB に関連付けられているコマンド プロンプト ウィンドウはロックされたままになり、デバッグの続行中は使用できなくなります。 NTSD を使用する場合、ターゲット コンピューター上に NTSD にプロセス ID が関連付けられている場合でも、追加のウィンドウは作成されません。
この組み合わせシナリオでは、「スイッチング モード」 トピックで説明されている 4 つのモードとその切り替え方法は、次の違いがあります。
2 つの異なるユーザー モード デバッグ モードがあります。 ターゲット コンピューターが実行されている場合、デバッグ サーバーは、他のリモート デバッグ セッションと同様に、デバッグ クライアントによって制御されます。これは、リモート制御ユーザー モード デバッグ
呼び出されます。 カーネル モード デバッガーがターゲット コンピューターに侵入し、 Input>
プロンプトが表示されている場合、ユーザー モード デバッガーはカーネル デバッガーによって制御されます。これはカーネル制御のユーザーモードデバッグ と呼ばれます。これら 2 つのモードは同時に使用できません。 ユーザー モード デバッガーがアクティブであっても、ターゲット コンピューターにカーネル デバッガーが分割されると、ターゲット コンピューターはリモート トランスポート プロトコルを処理できないため、ユーザー モード デバッガーはこの接続を介してリモート入力を受信できません。
ユーザー モード シンボルがシンボル サーバー上にある場合は、リモート制御ユーザー モード デバッグ モードの間に、シンボル アクセスを必要とするデバッガー コマンドを発行する必要があります。
カーネル制御のユーザー モード デバッグからリモート制御ユーザー モード デバッグに切り替えるには、.sleep (デバッガーの一時停止) コマンドを使用します。 ユーザー モード デバッガーがスリープ コマンドから復帰すると、リモート制御ユーザー モード デバッグ モードになります。
リモート制御のユーザー モード デバッグからカーネル モード デバッグに切り替えるには、
Input>
プロンプトから任意のコマンドを入力します。 このプロンプトが表示されない場合は、カーネル モード デバッグに切り替え、kd>
プロンプトで g (Go) コマンドを使用します。
内部的には、-ddefer で開始されたユーザー モード デバッガーは、デバッグ クライアントからの入力に対して第 1 の優先順位を与え、カーネル デバッガーからの入力に対して 2 番目の優先順位を与えます。 ただし、カーネル デバッガーがターゲット コンピューターに割り込んだ場合、リモート接続が使用できないため、同時入力間で競合が発生することはありません。