2

サードパーティのライブラリを使用して 1 つの単純なタスク (ラスタライズ) を実行する小さなユーティリティ (VC 2010、clr なし) を作成しています。後のユーティリティは、より大きなアプリケーションで使用されます。サード パーティ製ライブラリのヒープ破損が原因で、ユーティリティがクラッシュすることがあります。それは問題ありませんが、Windows (Vista/2008) では、「プログラムが動作を停止しました... プログラムを閉じる/デバッグする」というよく知られたダイアログが表示されます。私の場合(サーバー側)には適切ではありません。ユーティリティは、目に見える影響を与えることなく、静かにクラッシュ/終了する必要があります。

そのために、未処理の例外 (SetUnhandledExceptionFilter) 用に SEH をインストールしました。ハンドラーは、AV ( *(PDWORD)0 = 0 ) のような例外に対して完全に呼び出されますが、何らかの理由で、ヒープ破損の場合には呼び出されません。アンロード中に、サード パーティ製ライブラリ dll の 1 つの dllmain で破損が発生します。

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

4

2 に答える 2

0

しかし、何らかの理由で、ヒープが破損した場合には呼び出されません。アンロード中に、サード パーティ製ライブラリ dll の 1 つの dllmain で破損が発生します。

ヒープの破損は未定義の動作です。例外をスローする可能性がありますが、そうでない可能性があります。バグのあるサード パーティのライブラリがヒープを台無しにしている場合、問題は、「そもそも、なぜ彼らが自分のヒープを台無しにすることを許可しているのですか?」ということです。

プロセスが異常終了するたびに、「プログラムが動作を停止しました」というダイアログが表示されます。すべてのプロセスの異常終了が例外に起因するわけではありません。多くのエラー (スタック オーバーフロー、ミスアライン スタックなど) により、プロセスが即座に終了し、そのメッセージが表示される場合がありますが、エラーを処理する機会はありません。

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

于 2011-12-07T06:46:26.153 に答える