Win32の/ C用の取扱シャットダウン例外++
-
22-09-2019 - |
質問
私はそのハンドル例外偉大なプロセスを持っています。これは、呼び出してます:
_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」のメモリを参照しました。メモリが「read」になることができませんでした。終了するには[OK]をクリックします.... "
はそれのようなルックスx000000004のメモリ参照は、おそらくヌルポインタです。そして、そのアドレスのを見ていると、(おそらくグローバルがクリーンアップされているCRTのinittermコールで)グローバルSTLオブジェクトのデストラクタするの表示されます。
私は、診断ダンプとコールスタックを取得し、起こっている正確に何を見ることができないため、今、私は一種かかわらず、立ち往生のです。だから、....
なぜ例外は、上記のハンドラを介してルーティングされていない、その代わりにユーザに表示されますか?
非表示にするにはどのような方法があることをダイアログ(害がその時点で行われていないされているため)?
は、ルートエラーを追跡する方法はありますか?
任意のアイデアをお寄せいただきありがとうございます。
解決
彼らはどのようなオペレーティングシステムを実行している?
私はあなたのようなものを使用してエラーモードを設定していると仮定します。
::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
確認ウィンドウは、独自のエラー処理でジャンプされていないことを確認するには?
他のヒント
CRTのようなこの音は、コードのいくつかの部分の周りに(、適切でマークダウンキック、それを書くことはできません)を、そしてあなたが呼び出して終わることはありませんので、メッセージを表示するには、例外をキャッチされたSEHのtry / catchブロックを入れていますの未処理のの例外コードパス。あなたは何が起こっているかを把握するためにハッキングいくつかのCRTを行う必要があります。
これは、そのSTLコードは(あなたが使用していることSTLのバージョンに応じて)おそらくプログラムのシャットダウン時にグローバル変数の破壊時に実行されていることができ、それが必要とするいくつかのグローバル変数がすでに破棄されています。
私はVS2008のSTLでこれを見てきました。起動時にファイルレベルの静的を介して作成されているいくつかのSTLロックオブジェクトがあります。
あなたはエラーハンドラ関数でSTLを使用していますか?これは、これらのいずれかが、プログラムのシャットダウンに遅れてオフに行くと、問題を引き起こしている可能性があります。