2

stderrがリダイレクトされているときに、SetUnhandledExceptionFilter()によって設定されたUnhandledExceptionFilterをヒットする際に問題が発生します。

SetUnhandledExceptionFilter()によって設定されたカスタム例外フィルターがあります。これは、例外とスタックに関する詳細をstderrに書き出すことになっています。問題は、stderr出力をファイルにリダイレクトすると機能しないことです。まったく呼ばれていません。

を使用してプログラムを実行した場合

app.exe > log

フィルタが呼び出されますが、このように実行すると

app.exe 2> log

呼ばれていません。system()を使用して別のプログラムから問題のアプリケーションを呼び出すため、すでに別のアプローチを試しました。_pipe()_spawnvp()を使用して出力をリダイレクトし、パイプから読み取りましたが、それは役に立ちませんでした。

AddVectoredExceptionHandler()を調べ始めましたが、機能しているようですが、例外が発生すると呼び出され、未処理の例外が必要なため、try/catchコードでこれがどのように機能するかを理解する方法がわかりません。

プログラムがデバッガー(http://support.microsoft.com/kb/173652/en-us )で実行されるときにUnhandledExceptionFilterが呼び出されないことはすでに知っていますが、なぜstderrのリダイレクトをそのように扱うのですか?デバッガーで実行されますか?これを防ぐ方法はありますか?

4

1 に答える 1

1

私の愚かな間違いを見つけました。

例外フィルターが呼び出されますが、関数の後にアプリケーションが終了するため、データはまだストリームにスタックされ、フラッシュされません。追加すると

fflush(stderr);

私の例外フィルターの最後に、実際に書かれています。

投稿した直後に私の間違いをもう一度理解して申し訳ありませんが、これは実際には問題であり、数時間だけでなく数か月間私を悩ませました.

于 2011-05-17T07:29:34.017 に答える