2

vs デバッガーで奇妙な問題が発生しています。vs デバッガーでプログラムを実行すると、ハンドルされない例外でデバッガーが中断しません。代わりに、プログラムが正常に終了したかのように、制御が VS に返されます。出力タブを見ると、スレッド終了の直前に最初のチャンスの例外がリストされています。

[デバッグ] メニューの [例外] ボックスの使用方法を理解しています。未処理の例外の中断をチェックしました。発生している特定の例外の初回例外をチェックすると、デバッガーが停止します。

ただし、デバッガーは「未処理の例外」でも停止する必要があることを理解しています。それは私のためにこれをしていません。

出力タブの最後の数行は次のとおりです。

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
The thread 0x60c has exited with code 0 (0x0).
The program '[3588] ALMSSecurityManager.vshost.exe: Managed' has exited with code -532459699 (0xe0434f4d).

例外が未処理のときに「最初のチャンス」例外としてフラグが立てられる理由がわかりません。

0xe0434f4d 終了コードは一般的な COM エラーだと思います。

何か案は?

メトロ。

4

6 に答える 6

6

「例外...」ダイアログに 2 つのチェック ボックスがあることについての回答を読んだとき、戻ってダイアログをもう一度開きました。チェック ボックスは 1 列しかありませんでした。"Thrown" でブレークするためです。

結局のところ、[デバッグ] オプションで [自分のコードのみを有効にする (管理対象のみ)] をオンにしていないと、[例外] ダイアログに [ユーザー未処理] 列が表示されません。

「マイコードのみを有効にする」オプションを選択し、「例外」ダイアログの「ユーザー未処理」チェックボックスがすべての例外カテゴリに対して選択されていることを確認しました。

未処理の例外を取得して、1 つのセッションでデバッガーに割り込むことができました。しかし、翌日戻ってきたときの振る舞いは以前と同じでした。

メトロ。

于 2008-09-19T16:17:06.580 に答える
5

64 ビット OS を使用している場合、OS レベルの動作によって例外が消失する可能性がかなり高くなります。これを再現する最も確実な方法は、OnLoad で単純に例外をスローする新しい WinForm アプリケーションを作成することです。投げられないように見えます。これらを見てください:

  1. Windows 64 ビットで未処理の例外が発生しても Visual Studio が中断しない
    • http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/69a0b831-7782-4bd9-b910-25c85f18bceb
  2. OnLoad 例外が消えるケース
  3. x64 開発マシンでのサイレント例外 (Microsoft Connect)
    • https://connect.microsoft.com/VisualStudio/feedback/details/357311/silent-exceptions-on-x64-development-machines

1 つ目は、Google から見つけたもので (このスレッドが役に立たなかった後)、そのスレッドから次の 2 つにたどり着きました。2 番目に最も適切な説明があり、3 番目は Microsoft のバグ/チケットです (これは「設計による」動作であることを再確認します)。

したがって、基本的に、アプリケーションがスタックを戻る途中でカーネル モードの境界に到達する例外をスローすると、アプリケーションはその境界でブロックされます。そして、Windows チームは、例外が処理されたふりをすることが最善の対処方法であると判断しました。すべてが正常に完了したかのように実行が続行されます。

ああ、これはどこでも起こります。デバッグとリリースは関係ありません。.Net と C++ は関係ありません。これは OS レベルの動作です。

いくつかの重要なデータをディスクに書き込む必要があるが、カーネル モード境界の反対側で失敗したと想像してください。他のコードが後でそれを使用しようとし、運が良ければ、データに何か問題があることを検出します...しかし、なぜでしょうか? 例外がスローされると予想していたので、アプリケーションがデータの書き込みに失敗したとは考えていないに違いありません。

ジャーク。

于 2010-12-04T17:13:00.887 に答える
2

Ctl-D、E で例外ウィンドウが表示されます。中断したい例外と中断したくない例外を設定できます。

于 2008-09-19T15:42:55.227 に答える
0

時々、これは私にも起こります。シナリオを複製すると、例外がキャッチされ、通常どおり表示されるため、バグか何かのようです。

于 2008-09-19T15:51:34.177 に答える
0

同様の問題があり、「私のコードのみを有効にする(管理対象のみ)」をチェックすると問題が修正されましたが、オフに戻すと問題が再発しましたが、理由はわかりません(ただし、一部のDLLがチェックされていないときに読み込まれると、動作が発生します)。

于 2012-07-24T20:03:46.933 に答える
0

「例外...」ボックスには2つのチェックボックスがあります。通常、未処理の例外で中断するには、両方をチェックする必要があります。1つをチェックする必要があるようにしか読めないにもかかわらず。

于 2008-09-19T15:42:51.967 に答える