CDB を使用したユーザーモード プロセスのデバッグ

CDB を使用して、実行中のプロセスにアタッチしたり、新しいプロセスを生成してそれにアタッチしたりできます。

実行中のプロセスへのアタッチ

コマンド プロンプト

コマンド プロンプト ウィンドウで、CDB を起動するときに実行中のプロセスにアタッチできます。 次のコマンドのいずれかを使用します。

  • cdb -pProcessID
  • cdb -pnProcessName

ここで、ProcessID は実行中のプロセスのプロセス ID、ProcessName は実行中のプロセスの名前です。

コマンド ライン構文の詳細については、「CDB コマンド ライン オプション」を参照してください。

CDB コマンド ウィンドウ

デバッガーが既に 1 つ以上のプロセスをデバッグしている場合は、.attach (プロセスへのアタッチ) コマンドを使用して、実行中のプロセスにアタッチできます。

デバッガーは、一部のスレッドが固定または中断されていない限り、常に複数のターゲット プロセスを同時に開始します。

.attach コマンドが成功すると、次回デバッガーが実行コマンドを発行するときに指定されたプロセスにアタッチします。 このコマンドを 1 行に複数回使用する場合は、このコマンドを使用する回数と同じだけ、デバッガーから実行を要求される必要があります。

実行中のプロセスへの非侵襲的なアタッチ

実行中のプロセスをデバッグし、その実行への干渉を最小限にする場合は、プロセスを非侵襲的にデバッグする必要があります。

コマンド プロンプト

CDB コマンド ラインから実行中のプロセスを非侵襲的にデバッグするには、次の構文で -pv オプション、-p オプション、およびプロセス ID を指定します。

cdb -pv -pProcessID

または、プロセス名を指定して実行中のプロセスを非侵襲的にデバッグするには、代わりに次の構文を使用します。

cdb -pv -pnProcessName

他にも便利なコマンド ライン オプションがいくつかあります。 コマンド ライン構文の詳細については、「CDB コマンド ライン オプション」を参照してください。

CDB コマンド ウィンドウ

デバッガーが既にアクティブな場合は、.attach -v (プロセスへのアタッチ) コマンドを入力して、実行中のプロセスを非侵襲的にデバッグできます。

デバッガーが既に 1 つ以上のプロセスを侵襲的にデバッグしている場合は、.attach コマンドを使用できます。

.attach -v コマンドが成功すると、次回デバッガーが実行コマンドを発行するときに指定されたプロセスをデバッグします。 非侵襲的なデバッグ中は実行が許可されないため、デバッガーは一度に複数のプロセスを非侵襲的にデバッグすることはできません。 この制限は、.attach -v コマンドを使用すると、既存の侵襲的なデバッグ セッションの有用性が低下する可能性があることを意味します。

新しいプロセスの生成

CDB は、ユーザー モード アプリケーションを起動し、アプリケーションをデバッグできます。 アプリケーションは名前で指定されます。 デバッガーは、子プロセス (元のターゲット プロセスが開始した追加のプロセス) に自動的にアタッチすることもできます。

デバッガーが作成するプロセス (生成されたプロセスとも呼ばれます) は、デバッガーが作成していないプロセスとは動作が少し異なります。

デバッガーが作成するプロセスは、標準ヒープ API を使用する代わりに、特別なデバッグ ヒープを使用します。 _NO_DEBUG_HEAP 環境変数または -hd コマンド ライン オプションを使用して、生成されたプロセスがデバッグ ヒープの代わりに標準ヒープを使用するように強制できます。

また、ターゲット アプリケーションはデバッガーの子プロセスであるため、デバッガーのアクセス許可を継承します。 このアクセス許可により、ターゲット アプリケーションが、それ以外の方法では実行できなかった特定のアクションを実行できるようになる場合があります。 たとえば、ターゲット アプリケーションが保護されたプロセスに影響を与える可能性があります。

コマンド プロンプト ウィンドウで、CDB を起動するときに新しいプロセスを生成できます。 次のコマンドを入力します。

cdb [-o]ProgramName[Arguments]

-o オプションを使用すると、デバッガーは子プロセスにアタッチします。 他にも便利なコマンド ライン オプションがいくつかあります。 コマンド ライン構文の詳細については、「CDB コマンド ライン オプション」を参照してください。

デバッガーが既に 1 つ以上のプロセスをデバッグしている場合は、.create (プロセスの作成) コマンドを入力して新しいプロセスを作成できます。

デバッガーは、一部のスレッドが固定または中断されていない限り、常に複数のターゲット プロセスを同時に開始します。

.create コマンドが成功した場合、デバッガーは次にデバッガーが実行コマンドを発行するときに指定されたプロセスを作成します。 このコマンドを 1 行に複数回使用する場合は、このコマンドを使用する回数と同じだけ、デバッガーから実行を要求される必要があります。

.create の前に .createdir (作成されるプロセス ディレクトリの設定) コマンドを使用して、アプリケーションの開始ディレクトリを制御できます。 .createdir -I コマンドまたは -noinh コマンド ライン オプションを使用して、ターゲット アプリケーションがデバッガーのハンドルを継承するかどうかを制御できます。

.childdbg (子プロセスのデバッグ) コマンドを使用して、子プロセスのデバッグをアクティブ化または非アクティブ化できます。

プロセスへの再アタッチ

デバッガーが応答を停止したりフリーズしたりした場合は、新しいデバッガーをターゲット プロセスにアタッチできます。 この状況でデバッガーをアタッチする方法について詳しくは、「ターゲット アプリケーションへの再アタッチ」を参照してください。