質問

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 エラーだと思います。

何か案は?

メトロ。

役に立ちましたか?

解決

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/フィードバック/詳細/357311/silent-Exceptions-on-x64-development-machines

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

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

ああ、こういうことが起こるんだ どこにでも. 。デバッグとリリースは無関係です。.Net と C++ は無関係です。これは OS レベルの動作です。

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

ジャーク。

他のヒント

「例外...」ダイアログに 2 つのチェックボックスがあることに関する回答を読んだとき、戻ってダイアログを再度開きました。チェックボックスの列は 1 列だけで、「Thrown」のブレーク用でした。

結局のところ、デバッグ オプションで [マイ コードのみを有効にする (マネージドのみ)] がチェックされていない場合、[例外] ダイアログに [ユーザー未処理] 列が表示されません。

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

1 つのセッションの間、未処理の例外を取得してデバッガーに侵入することができました。しかし、翌日戻ってきたら、態度は以前と同じでした。

メトロ。

Ctl-D、E を押すと、「例外」ウィンドウが表示されます。どのような例外を中断させたいか、中断させたくないかを設定できます。

[例外...] ボックスには 2 つのチェックボックスがあります。未処理の例外で中断するには、通常、両方のチェックボックスをオンにする必要があります。それにもかかわらず、それはあなたがチェックする必要があるようにしか読めません。

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

私も同様の問題を抱えていましたが、「マイ コードのみを有効にする (マネージドのみ)」にチェックを入れると問題は解決しましたが、オフに戻すと問題が再発しました。理由はわかりませんでした (ただし、一部の DLL が問題を解決している可能性があります)。チェックされていない場合にロードされると動作が発生します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top