システムのユーザー モード例外の処理は、高度なデバッガーをサポートします。 例外が発生したプロセスがデバッグ中の場合、システムはデバッグ イベントを生成します。 デバッガーが WaitForDebugEvent 関数を使用している場合、デバッグ イベントにより、その関数は DEBUG_EVENT 構造体へのポインターで返されます。 この構造体には、デバッガーがスレッドのコンテキスト レコードにアクセスするために使用できるプロセスとスレッド識別子が含まれています。 構造体には、例外レコードのコピーを含む EXCEPTION_DEBUG_INFO 構造体も含まれています。
システムは、例外ハンドラーを検索するときに、プロセスのデバッガーに通知するために 2 回試行します。 最初の通知試行では、ブレークポイントまたは単一ステップの例外を処理する機会がデバッガーに提供されます。 これは、のファーストチャンス通知として知られています。 その後、ユーザーはデバッガー コマンドを発行して、例外ハンドラーが実行される前にプロセスの環境を操作できます。 デバッガーに通知する 2 回目の試行は、システムが例外を処理するフレーム ベースの例外ハンドラーを見つけることができない場合にのみ発生します。 これは、ラストチャンス通知と呼ばれます。 前回の通知の後にデバッガーが例外を処理しない場合、システムはデバッグ中のプロセスを終了します。
通知の試行ごとに、デバッガーは ContinueDebugEvent 関数を使用して制御をシステムに返します。 制御を返す前に、デバッガーは例外を処理し、必要に応じてスレッドの状態を変更するか、例外を処理しないことを選択できます。 ContinueDebugEvent 使用すると、デバッガーは例外を処理したことを示すことができます。その場合、マシンの状態が復元され、例外が発生した時点でスレッドの実行が続行されます。 デバッガーは、例外を処理しなかったことを示すこともできます。これにより、システムは例外ハンドラーの検索を続行します。