さまざまなメソッドを使用して、ユーザー モードおよびカーネル モード のアプリケーションで例外をキャッチして処理できます。 アクティブなデバッガー、事後デバッガー、または内部エラー処理ルーチンはすべて、例外を処理する一般的な方法です。
これらのさまざまな例外ハンドラーの優先順位の詳細については、「 事後デバッグの有効化」を参照してください。
Microsoft Windows オペレーティング システムでデバッガーが例外を処理できる場合、例外を生成したアプリケーションはデバッガー に分割 されます。 つまり、アプリケーションが停止し、デバッガーがアクティブになります。 デバッガーは、何らかの方法で例外を処理したり、状況を分析したりできます。 その後、デバッガーはプロセスを終了するか、実行を再開できます。
デバッガーが例外を無視し、アプリケーションの実行を継続できる場合、オペレーティング システムはデバッガーが存在しないかのように他の例外ハンドラーを探します。 例外が処理された場合、アプリケーションの実行は続行されます。 ただし、例外が未処理のままの場合、デバッガーには状況に対処する 2 回目の機会が与えられる。
デバッガーを使用した例外の分析
例外またはイベントがデバッガーに侵入すると、デバッガーを使用して、実行中のコードと、アプリケーションが使用しているメモリを調べることができます。 特定の数量を変更したり、アプリケーション内の別のポイントにジャンプしたりすることで、例外の原因を削除できる場合があります。
実行を再開するにはgh (Go with Exception Handled) またはgn (Go with Exception Not Handled)コマンドを発行します。
デバッガーの 2 回目の例外処理の機会に gn コマンドを発行すると、アプリケーションは終了します。
Kernel-Mode 例外
カーネル モード コードで発生する例外は、ユーザー モードの例外よりも深刻です。 カーネル モードの例外が処理されない場合は、 バグ チェック が発行され、システムが停止します。
ユーザー モードの例外と同様に、カーネル モード デバッガーがシステムにアタッチされている場合、 バグ チェック画面 ( ブルー スクリーンとも呼ばれます) が表示される前にデバッガーに通知されます。 デバッガーがアタッチされていない場合は、バグ チェック画面が表示されます。 この場合、オペレーティング システムによって クラッシュ ダンプ ファイルが作成される可能性があります。
デバッガーからの例外とイベントの制御
特定の方法で、指定された例外とイベントに対応するようにデバッガーを構成できます。
デバッガーは、各例外またはイベントの中断状態を設定できます。
イベントは、発生するとすぐにデバッガーに中断を引き起こす可能性があります ("最初のチャンス")。
イベントは、他のエラー ハンドラーに応答する機会が与えられた後に中断する可能性があります ("2 回目のチャンス")。
イベントはデバッガーにメッセージを送信することもできますが、実行を続けます。
デバッガーはイベントを無視できます。
デバッガーでは、各例外とイベントの処理状態を設定することもできます。 デバッガーは、処理された例外や未処理の例外のようにイベントを処理できます。 (もちろん、実際にはエラーではないイベントは、処理を必要としません。
次のいずれかの操作を行って、中断状態と処理状態を制御できます。
(CDB と NTSD)コマンド ラインで -x、-xe、-xd、-xn、または -xi オプションを使用します。
(CDB、NTSD、KD)Tools.ini ファイルで sxe キーワードまたは sxd キーワードを使用します。
(WinDbg のみ)[デバッグ] メニューの [イベント フィルター] を選択して [イベント フィルター] ダイアログ ボックスを開き、目的のオプションを選択します。
通常、SX\* コマンド、-x\* コマンド ライン オプション、および sx\* Tools.ini キーワードは、指定したイベントの中断状態を設定します。 代わりに -h オプションを追加して、処理状態を設定することができます。
中断状態ではなく、常に処理状態を指定する 4 つの特殊なイベント コード (cc、 hc、 bpec、 および ssec) があります。
.lastevent (最後のイベントの表示) コマンドを使用して、最新の例外またはイベントを表示できます。
中断状態の制御
例外またはイベントの中断状態を設定する場合は、次のオプションを使用できます。
| Command | 状態名 | Description |
|---|---|---|
| SXE または -xe | 休憩 (有効) |
この例外が発生すると、ターゲットはすぐにデバッガーに割り込まれます。 この中断は、他のエラー ハンドラーがアクティブになる前に発生します。 このメソッドは、 初回確率処理と呼ばれます。 |
| SXD または -xd | 2 回目のチャンスブレーク (無効) |
この種の初回例外では、デバッガーは中断しません (メッセージが表示されます)。 他のエラー ハンドラーがこの例外に対処できない場合は、実行が停止し、ターゲットがデバッガーに分割されます。 このメソッドは、 秒確率処理と呼ばれます。 |
| SXN または -xn | アウトプット (通知) |
この例外が発生しても、ターゲット アプリケーションはデバッガーにまったく侵入しません。 ただし、この例外をユーザーに通知するメッセージが表示されます。 |
| SXI または -xi | 不問に付す |
この例外が発生した場合、ターゲット アプリケーションはデバッガーに移行して中断されることはなく、メッセージも表示されません。 |
SX* 設定によって例外が予測されない場合、ターゲットアプリケーションはセカンドチャンスでデバッガーで停止します。 イベントの既定の状態については、このトピックの「イベント定義と既定値」セクションを参照してください。
WinDbg グラフィカル インターフェイスを使用して中断状態を設定するには、[デバッグ] メニューの [イベント フィルター] ダイアログ ボックスの一覧から目的のイベントを選択し、[有効]、[無効]、[出力]、または [無視] を選択します。
処理ステータスの制御
gh (Go with Exception Handled) コマンドを使用しない限り、すべてのイベントは未処理と見なされます。
sx\* コマンドを -h オプションと共に使用しない限り、すべての例外はハンドルされないと見なされます。
さらに、 SX* オプションでは、無効なハンドル、STATUS_BREAKPOINT中断命令、および単一ステップ例外の処理状態を構成できます。 (この構成は、中断構成とは別です)。中断状態を構成すると、これらのイベントの名前はそれぞれ ch、 bpe、 および sse になります。 それらの処理状態を構成すると、これらのイベントはそれぞれ hc、 bpec、 および ssec という名前になります。 (イベントの完全な一覧については、次の「イベント定義と既定値」セクションを参照してください)。
Ctrl + C イベント (cc) の処理状態は構成できますが、中断状態は構成できません。 アプリケーションが Ctrl + C イベントを受け取った場合、アプリケーションは常にデバッガーに分割されます。
cc、hc、bpec、および ssec イベントで SX* コマンドを使用する場合、または例外で -h オプションと共に SX* コマンドを使用すると、次のアクションが発生します。
| Command | 状態名 | Description |
|---|---|---|
SXE |
処理 |
このイベントは、実行が再開されたときに処理されると見なされます。 |
SXD、SXN、SXI |
未処理 |
このイベントは、実行が再開されるときに処理されないと見なされます。 |
WinDbg グラフィカル インターフェイスを使用して処理状態を設定するには、[デバッグ] メニューの [イベント フィルター] を選択し、[イベント フィルター] ダイアログ ボックスの一覧から目的のイベントを選択し、[処理済み] または [処理されていません] を選択します。
自動コマンド
また、デバッガーでは、イベントまたは例外によってデバッガーが中断された場合に自動的に実行されるコマンドを設定することもできます。 一時中断のコマンド文字列と、2 回目の中断のコマンド文字列を設定できます。 これらの文字列は SX\* コマンドまたは Debug | イベント フィルター コマンドで設定できます。 各コマンド文字列には、セミコロンで区切られた複数のコマンドを含めることができます。
これらのコマンドは、中断状態に関係なく実行されます。 つまり、中断状態が "無視" の場合、コマンドは引き続き実行されます。 中断状態が "2 回目の中断" の場合、他の例外ハンドラーが関与する前に、例外が最初に発生したときに first-chance コマンドが実行されます。 コマンド文字列は、g (Go)、gh (Go with Exception Handled)、gn (Go with Exception Not Handled)などの実行コマンドで終了できます。
イベント定義と既定値
次の例外の中断状態または処理状態を変更できます。 既定の中断状態が示されます。
次の例外の既定の処理状態は常に "Not Handled" です。 この状態の変更には注意してください。 この状態を "Handled" に変更すると、この種類のすべての最初の確率例外と 2 回目の例外が処理されたと見なされ、この構成ではすべての例外処理ルーチンがバイパスされます。
| イベント コード | Meaning | 既定の中断状態 |
|---|---|---|
asrt |
アサーションエラー |
分割 |
av |
アクセス違反 |
分割 |
dm |
データの位置がずれている |
分割 |
アルジェリア |
0 による整数除算 |
分割 |
c000008e |
0 による浮動小数点除算 |
分割 |
えっ |
C++ EH 例外 |
チャンスをもう一度 |
gp |
ガード ページ違反 |
分割 |
ii |
無効な命令 |
再挑戦のチャンス |
iov |
整数オーバーフロー |
分割 |
ip の |
ページ内 I/O エラー |
分割 |
isc |
無効なシステム呼び出し |
分割 |
lsq |
無効なロック シーケンス |
分割 |
sbo |
スタック バッファー オーバーフロー |
分割 |
sov |
スタック オーバーフロー |
分割 |
wkd |
ウェイク デバッガー |
分割 |
aph |
アプリケーションの応答停止 この例外は、Windows オペレーティング システムがプロセスの応答を停止した (つまり ハングした) と判断した場合にトリガーされます。 |
分割 |
3c |
子アプリケーションの終了 |
セカンドチャンスのブレーク |
ch |
無効なハンドル |
分割 |
Number |
任意の番号付き例外 |
再試行チャンス |
手記ah (Assertion Handling) コマンドを使用して、特定のアドレスの asrt break 状態をオーバーライドできます。 ch イベント コードと hc イベント コードは、同じ例外を参照します。 中断状態を制御する場合は、 sx* ch を使用します。 処理状態を制御する場合は、 sx* hc を使用します。
次の例外の中断状態または処理状態を変更できます。 既定の中断状態が示されます。
次の例外の既定の処理状態は常に "処理済み" です。 これらの例外はデバッガーとの通信に使用されるため、通常は状態を "Not Handled" に変更しないでください。 この状態により、デバッガーが例外を無視すると、他の例外ハンドラーが例外をキャッチします。
アプリケーションは、DBG_COMMAND_EXCEPTION (dbce) を使用してデバッガーと通信できます。 この例外はブレークポイントに似ていますが、 SX* コマンドを使用して、この例外が発生したときに特定の方法で対応できます。
| イベント コード | Meaning | 既定の中断状態 |
|---|---|---|
dbce |
特殊なデバッガー コマンドの例外 |
Ignore |
vcpp |
特殊な Visual C++ 例外 |
Ignore |
ウォス |
WOW64 シングル ステップ例外 |
分割 |
wob |
WOW64 ブレークポイントの例外- |
分割 |
sse |
単一ステップの例外 |
分割 |
bpe |
ブレークポイントの例外 |
分割 |
cce |
Ctrl + C または Ctrl + Break この例外は、ターゲットがコンソール アプリケーションであり、Ctrl + C または Ctrl + BREAK が渡された場合にトリガーされます。 |
分割 |
手記 前の表の最後の 3 つの例外には、2 つの異なるイベント コードがあります。 中断状態を制御する場合は、 sse、 bpe、 および cce を使用します。 それらの処理状態を制御する場合は、 ssec、 bpec、および cc を使用 します。
次の例外は、マネージド コードをデバッグする場合に役立ちます。
| イベント コード | Meaning | 既定の状態 |
|---|---|---|
clr |
共通言語ランタイムの例外 |
再試行の機会 処理されない |
clrn |
共通言語ランタイム通知の例外 |
再チャンスの休憩 処理済み |
次のイベントの中断状態を変更できます。 これらのイベントは例外ではないため、処理状態は関係ありません。
| イベント コード | Meaning | 既定の中断状態 |
|---|---|---|
ser |
システム エラー |
Ignore |
cpr[:プロセス] |
プロセスの作成 このイベントの中断状態の設定は、ユーザー モードデバッグにのみ適用されます。 このイベントはカーネル モードでは発生しません。 このイベントを制御できるのは、-oコマンド ライン オプション または .childdbg (Debug Child Processes) コマンドを使用して、CDB または WinDbg で子プロセスのデバッグをアクティブ化した場合のみです。 プロセス名には、オプションのファイル名拡張子と、ワイルドカード文字としてアスタリスク () または疑問符 (?) を含めることができます。 デバッガーは、最新の cpr 設定のみを記憶します。 個別のプロセスに対する個別の設定はサポートされていません。 cpr と Process の間にコロンまたはスペースを含めます。 Process を省略すると、子プロセスの作成に設定が適用されます。 |
Ignore |
epr[:Process] |
プロセスの終了 このイベントの中断状態の設定は、ユーザー モードデバッグにのみ適用されます。 このイベントはカーネル モードでは発生しません。 このイベントを制御できるのは、-oコマンド ライン オプション または .childdbg (Debug Child Processes) コマンドを使用して、CDB または WinDbg で子プロセスのデバッグをアクティブ化した場合のみです。 プロセス名には、オプションのファイル名拡張子と、ワイルドカード文字としてアスタリスク () または疑問符 (?) を含めることができます。 デバッガーは、最新の epr 設定のみを記憶します。 個別のプロセスに対する個別の設定はサポートされていません。 epr と Process の間にコロンまたはスペースを含めます。 Process を省略すると、設定は子プロセスの終了に適用されます。 |
Ignore |
ct |
スレッドの作成 |
Ignore |
et |
スレッドの終了 |
Ignore |
ld[:Module] |
モジュールの読み込み Module を指定すると、この名前のモジュールが読み込まれるときに中断が発生します。 モジュール は、モジュールの名前またはアドレスを指定できます。 名前が使用されている場合、 モジュール にはさまざまなワイルドカード文字と指定子が含まれている可能性があります。 (構文の詳細については、「 文字列ワイルドカード構文」を参照してください)。 デバッガーは、最新の ld 設定のみを記憶します。 個別のモジュールの個別の設定はサポートされていません。 ld と Module の間にコロンまたはスペースを含めます。 Module を省略すると、モジュールが読み込まれるときにイベントがトリガーされます。 |
アウトプット |
ud[:Module] |
アンロード モジュール Module を指定した場合、この名前のモジュールまたはこのベース アドレスのモジュールがアンロードされるときに中断が発生します。 モジュール は、モジュールの名前またはアドレスを指定できます。 名前が使用されている場合、 モジュール は正確な名前にすることも、ワイルドカード文字を含めることもできます。 Module が正確な名前の場合、現在のデバッガー モジュールの一覧を使用してベース アドレスに直ちに解決され、アドレスとして格納されます。 Module にワイルドカード文字が含まれている場合、アンロード イベントが発生したときに後で一致するためにパターン文字列が保持されます。 まれに、デバッガーにはアンロード イベントの名前情報が含まれず、ベース アドレスによってのみ一致します。 したがって、 モジュール にワイルドカード文字が含まれている場合、デバッガーは、この特定のアンロードケースで名前の一致を実行できず、モジュールがアンロードされたときに中断します。 デバッガーは、最新の ud 設定のみを記憶します。 個別のモジュールの個別の設定はサポートされていません。 ud と Module の間にコロンまたはスペースを含めます。 Module を省略すると、モジュールが読み込まれるときにイベントがトリガーされます。 |
アウトプット |
out[:Output] |
ターゲット アプリケーションの出力 出力を指定すると、指定したパターンに一致する出力を受信した場合にのみ中断が発生します。 出力 には、さまざまなワイルドカード文字と指定子を含めることができます。 (構文の詳細については、「 文字列ワイルドカード構文」を参照してください)。ただし、 出力 にコロンまたはスペースを含めることはできません。 一致の際に大文字と小文字は区別されません。 out と Output の間にコロンまたはスペースを含めます。 |
Ignore |
ibp |
最初のブレークポイント (このイベントは、デバッグ セッションの開始時およびターゲット コンピューターの再起動後に発生します)。 |
ユーザーモードの場合: ブレーク。 -gコマンド ライン オプションを使用して、この状態を "無視" に変更できます。 カーネル モードの場合: 不問に付す。 この状態は、さまざまな方法で "有効" に変更できます。 この状態を変更する方法の詳細については、「 ターゲット コンピューターのクラッシュと再起動」を参照してください。 |
iml |
初期モジュールの読み込み (カーネル モードのみ) |
[無視]。 この状態は、さまざまな方法で "中断" に変更できます。 この状態を変更する方法の詳細については、「 ターゲット コンピューターのクラッシュと再起動」を参照してください。 |