WinDbg クラシックを使用したユーザー モード プロセスのデバッグ

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

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

WinDbg を使用して実行中のプロセスにアタッチするには、いくつかの方法があります。 選択する方法に関係なく、プロセス ID またはプロセス名が必要です。 プロセス ID は、オペレーティング システムによって割り当てられた番号です。 プロセス ID とプロセス名を確認する方法について詳しくは、「プロセス ID を見つける」を参照してください。

WinDbg メニュー

WinDbg が休止モードのときは、[ファイル] メニューから [プロセスへのアタッチ] を選択するか、F6 キーを押して、実行中のプロセスにアタッチできます。

[プロセスへのアタッチ] ダイアログ ボックスで、デバッグするプロセスを選択し、[OK] を選択します。

コマンド プロンプト

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

  • windbg -p ProcessID
  • windbg -pn ProcessName

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

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

デバッガー コマンド ウィンドウ

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

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

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

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

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

WinDbg メニュー

WinDbg が休止モードのときは、[ファイル] メニューから [プロセスへのアタッチ] を選択するか、F6 キーを押して、実行中のプロセスを非侵襲的にデバッグできます。

[プロセスへのアタッチ] ダイアログ ボックスが表示されたら、[非侵襲的] チェック ボックスをオンにします。 そして、必要なプロセス ID とプロセス名を含む行を選択します。 (プロセス ID を [プロセス ID] ボックス に入力することもできます)。最後に、[OK] を選択します。

コマンド プロンプト

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

  • windbg -pv -p ProcessID
  • windbg -pv -pn ProcessName

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

デバッガー コマンド ウィンドウ

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

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

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

新しいプロセスの生成

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

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

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

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

WinDbg メニュー

WinDbg が休止モードのときは、[ファイル] メニューから [実行可能ファイルを開く] を選択するか、CTRL+E キーを押して、新しいプロセスを生成できます。

[実行可能ファイルを開く] ダイアログ ボックスが表示されたら、[ファイル名] ボックスに実行可能ファイルの完全なパスを入力するか、[検索対象] リストを使用して、目的のパスとファイル名を選択します。

ユーザー モード アプリケーションでコマンド ライン パラメーターを使用する場合は、[引数] ボックスにパラメーターを入力します。 既定のディレクトリから開始ディレクトリを変更する場合は、[開始ディレクトリ] ボックスにディレクトリ パスを入力します。 WinDbg を子プロセスにアタッチする場合は、[子プロセスもデバッグ] チェック ボックスをオンにします。

選択が終了したら、[開く] を選択します。

コマンド プロンプト

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

windbg [-o] ProgramName [Arguments]

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

デバッガー コマンド ウィンドウ

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

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

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

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

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

プロセスへの再アタッチ

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