1

サードパーティのライブラリを使用して簡単なタスク(ラスタライズ)を行う小さなユーティリティ(VC 2010、no clr)を作成しています。後のユーティリティは、より大きなアプリケーションで使用されます。サードパーティのライブラリでヒープが破損しているため、ユーティリティがクラッシュすることがあります。それはOKですが、Windows(Vista/2008)ではよく知られているダイアログが表示されます。「プログラムは動作を停止しました...プログラムを閉じる/デバッグしてください。私の場合は適切ではありません(サーバー側)。ユーティリティは、目に見えるエフェクトを使用せずにサイレントにクラッシュ/シャットダウンする必要があります。構造化例外ハンドラ(SEH)がヒープの破損をキャッチしない

これを行うには、処理されない例外(SetUnhandledExceptionFilter)に対してSEHをインストールしました。ハンドラは、AV(*(PDWORD)0 = 0)のような例外に対しては完全に呼び出されますが、何らかの理由でヒープの破損の場合には呼び出されません。第三者のライブラリdllのうち、アンロード中のDLLのdllmainで破損が発生します。

複数の質問があります。ハンドラが呼び出されない理由を誰でも説明できますか?そのダイアログを防ぐ他の方法はありますか?

+1

のDllMain()特別です。 Windowsは、プロセスを大きく不安定化させることなく、失敗を許可することはできません。それはあなたのフィルタが動作しないように実行中にSEH例外をトラップします。それほど多くはできません。バグを修正してください。サーバー上でWERを無効にし、serverfault.comで質問してください –

+0

ありがとうHans。それは理にかなっている。私は最初の問題を別の方法で解決しようとします。 –

+0

また、場合によってはこれが問題になる可能性があります。 http://stackoverflow.com/questions/19656946/why-setunhandledexceptionfilter-cannot-capture-some-exception-but-addvectoredexc –

答えて

1

どうやらそれは彼らが自分自身の例外コード(0xC0000374」で例外として放出されているにもかかわらず、ヒープの破損は、ユーザ定義の例外ハンドラによってキャッチすることができないことを意図的ですSTATUS_HEAP_CORRUPTION ")。ここで、「修正しない」として、基本的に閉鎖されたのVisual C++のバグレポートです:

https://connect.microsoft.com/VisualStudio/feedback/details/664497/cant-catch-0xc0000374-exception-status-heap-corruption

をあなたが発見したように、これはコンパイラのバグやOSではありません。あなたの関数が引き起こすヒープの破損は重大なエラーとして扱われ、そのエラーの処理の一部として、OSはプロセスを終了させます。これが原因で、例外ハンドラが呼び出されません。

私はWindowsエラー報告やクラッシュダンプを作成する他の方法がまだそれをキャッチできると思います。ダイアログを防ぐためとして

プロセスがブロックされないように、レジストリに次のいずれかを無効にWERは、完全に、または単にダイアログを無効にすることができます

https://msdn.microsoft.com/de-de/library/windows/desktop/aa366711(v=vs.85).aspx(「DontShowUI」を参照)

1

しかし、ヒープの破損の場合は何らかの理由で呼び出されません。第三者のライブラリdllのうち、アンロード中のDLLのdllmainで破損が発生します。

ヒープの破損は未定義の動作です。例外をスローすることがありますが、そうでない場合もあります。バグのある第三者図書館があなたのヒープを台無しにしている場合、質問は "なぜ彼らは最初にあなたのヒープを混乱させるのですか?"

プロセスが異常終了すると、「プログラムが停止しました」ダイアログが表示されます。プロセスの異常終了のすべてが例外から生じるわけではありません。多くのエラー(スタックのオーバーフロー、スタックの整列不良など)が発生すると、プロセスが即座に終了し、そのメッセージは表示されますが、エラーを処理する機会はありません。

(また、上記ハンス素晴らしいコメントを参照してください)

関連する問題