質問

私は、サードパーティライブラリを使用して1つの簡単なタスク(ラスター化)を行う小さなユーティリティ(VC 2010、No CLR)を書いています。後のユーティリティは、より大きなアプリケーションで使用されます。サードパーティライブラリのヒープの破損のために、ユーティリティがクラッシュすることがあります。それは大丈夫ですが、Windows(Vista/2008)は、よく知られているダイアログ「プログラムが機能しなくなった...閉鎖/デバッグプログラム」を示しています。私の場合は適切ではありません(サーバー側)。ユーティリティは、目に見える効果があれば静かにクラッシュ/終了する必要があります。

それを行うために、Unhandled Exception(SetunHandleDexceptionFilter)のためにSEHをインストールしました。ハンドラーは、AV( *(pdword)0 = 0)のような例外のために完全に呼び出されますが、何らかの理由でヒープの腐敗の場合は呼び出されません。腐敗は、荷降ろし中にサードパーティライブラリDLLの1つのDllmainで発生します。

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

役に立ちましたか?

解決

どうやら、独自の例外コード(0xc0000374 "status_heap_corruption")で例外として放出されている場合でも、ヒープの破損はユーザー定義の例外ハンドラーによってキャッチできないことを意図しているようです。これは、基本的に「修正しない」と基本的に閉鎖された視覚的な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」を参照)

他のヒント

しかし、何らかの理由で、ヒープの腐敗の場合は呼び出されません。腐敗は、荷降ろし中にサードパーティライブラリDLLの1つのDllmainで発生します。

ヒープの腐敗は未定義の動作です。例外をスローするかもしれません、そうでなければそうするかもしれません。バギーのサードパーティライブラリがヒープを台無しにしている場合、質問は「なぜ彼らがそもそもあなたのヒープを台無しにすることを許しているのですか?」です。

「プログラムが機能しなくなった」ダイアログは、プロセスが異常に終了するたびに表示されます。すべての異常なプロセス終了が例外から生じるわけではありません。多くのエラー(スタックオーバーフロー、誤った積み立てなど)により、プロセスの即時終了が発生します。これにより、そのメッセージが表示される可能性がありますが、エラーを処理する機会が与えられません。

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

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