次の方法で共有


デバッガーへの割り込み

ユーザー モードのコードとカーネル モードのコードは、異なるルーチンを使用してデバッガーに割り込みます。

ユーザー モードの割り込みルーチン

割り込みルーチンでは、呼び出し元のスレッドが呼び出し元プロセスに関連付けられているデバッガーに通知できるように、現在のプロセスで例外が発生します。

ユーザー モードのプログラムからデバッガーに割り込むには、DebugBreak 関数を使用します。 そのプロトタイプは次のとおりです。

VOID DebugBreak(VOID);

ユーザー モードのプログラムが DebugBreak を呼び出すと、次のアクションが発生します。

  1. ユーザー モードのデバッガーがアタッチされていると、プログラムはデバッガーに割り込みます。 つまり、プログラムが一時停止し、デバッガーがアクティブになります。

  2. ユーザー モードのデバッガーがアタッチされておらず、起動時にカーネル モードのデバッグが有効にされた場合、コンピューター全体がカーネル デバッガーに割り込みます。 カーネル デバッガーがアタッチされていない場合、コンピューターはフリーズし、カーネル デバッガーを待ちます。

  3. ユーザー モードのデバッガーがアタッチされておらず、カーネル モードのデバッグが有効になっていない場合、プログラムは未処理例外で終了し、事後分析 (just-in-time) デバッガーがアクティブになります。 詳細については、「事後デバッグを有効にする」を参照してください。

カーネル モードの割り込みルーチン

カーネル モードのプログラムがデバッガーに割り込むと、カーネル デバッガーが実行再開を許可するまで、オペレーティング システム全体がフリーズします。 カーネル デバッガーが存在しない場合は、バグ チェックとして扱われます。

DbgBreakPoint ルーチンはカーネル モードのコードで動作しますが、それ以外は DebugBreak ユーザー モードのルーチンに似ています。

DbgBreakPointWithStatus ルーチンも割り込みを発生させますが、さらに 32 ビットの状態コードをデバッガーに送信します。

KdBreakPoint ルーチンと KdBreakPointWithStatus ルーチンは、チェックされたビルド環境でコンパイルされた場合、それぞれ DbgBreakPoint および DbgBreakPointWithStatus と同一です。 無料のビルド環境でコンパイルした場合、効果はありません。

カーネル モードの条件付き割り込みルーチン

カーネル モードのコードでは、2 つの条件付き割り込みルーチンを使用できます。 これらのルーチンは、論理式をテストします。 式が false の場合は、実行が停止してデバッガーがアクティブになります。

  • ASSERT マクロは論理式をテストします。 式が false の場合は、実行が停止してデバッガーがアクティブになります。 失敗した式とそのプログラム内の場所がデバッガーに表示されます。

  • ASSERTMSG マクロは、デバッガーに追加メッセージを送信できる点を除けば ASSERT と同一です。

ASSERTASSERTMSG は、チェックされたビルド環境でコンパイルされた場合に限ってアクティブになります。 無料のビルド環境でコンパイルした場合、効果はありません。