1

例外をうまく処理するプロセスがあります。次のように呼び出します。

_set_se_translator(exception_trans_func); 
SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler);
_set_purecall_handler(purecallHandler);
set_terminate(terminateHandler);
set_unexpected(unexpectedHandler);
_set_invalid_parameter_handler(InvalidParameterHandler);
atexit(exitHandler); //ignored during an expected exit
_onexit(onexitHandler); //ignored during an expected exit

例外が発生するたびに、ハンドラーの 1 つが呼び出され、クラッシュ ダンプが作成されます。人生は素晴らしい。

1 つの顧客サイトを除きます。プロセスをシャットダウンすると、何らかの理由でこれらの呼び出しを経由しない例外が発生し、次のエラーが発生します。

「0x101ba9df」の命令が「0x00000004」のメモリを参照していました。メモリを「読み取る」ことができませんでした。[OK] をクリックして終了します....」

x000000004 のメモリ参照は、おそらく null ポインターのようです。そして、そのアドレスを見ると、グローバル STL オブジェクトのデストラクタのように見えます (おそらく、グローバルがクリーンアップされる CRT の initterm 呼び出しで)。

現在、診断ダンプとコール スタックを取得できず、何が起こっているのかを正確に確認できないため、ちょっと立ち往生しています。そう....

例外が上記のハンドラーを介してルーティングされず、代わりにユーザーに表示されるのはなぜですか?

そのダイアログを非表示にする方法はありますか (その時点で害はありません)。

根本的なエラーを追跡する方法はありますか?

アイデアをありがとう。

4

3 に答える 3

2

彼らはどのオペレーティングシステムを実行していますか?

次のようなものを使用してエラーモードを設定していると思います

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

Windowsが独自のエラー処理でジャンプしていないことを確認するには?

于 2009-11-26T15:20:19.067 に答える
1

これは、CRTがSEH try / catchブロック(正しく記述できない、Markdownが起動)をコードの一部の周りに配置し、メッセージを表示するために例外をキャッチしているように聞こえます。そのため、未処理の例外を呼び出すことはありません。コードパス。何が起こっているのかを理解するために、CRTハッキングを行う必要があるかもしれません。

于 2009-11-25T17:02:24.483 に答える
1

プログラムのシャットダウン時にグローバル変数の破棄中に STL コードが実行されている可能性があり、(使用している STL のバージョンによっては) 必要ないくつかのグローバル変数が既に破棄されている可能性があります。

私はVS2008のSTLでこれを見てきました。起動時にファイル レベルの static によって作成される STL ロック オブジェクトがいくつかあります。

エラー ハンドラ関数で STL を使用していますか? これらのいずれかがプログラムのシャットダウンの後半にオフになり、問題を引き起こしている可能性があります。

于 2009-11-25T21:03:27.067 に答える