クラッシュレポートダイアログが無効の場合のSetUnhandledExceptionFilterとデフォルト例外ハンドラ

私はSetUnhandledExceptionFilter( Googleブレイクパッド経由)を使ってアプリケーションをセットアップする状況がありますブレークパッド例外ハンドラがクラッシュを捕捉し、ミニダンプファイルを保存し、SetUnhandledExceptionFilter関数からEXCEPTION_EXECUTE_HANDLERを返して標準例外ハンドラを実行した後、カスタム例外ハンドラがハングしています。フィルタ機能がEXCEPTION_CONTINUE_SEARCHを返し、WindowsエラーレポートダイアログがSetErrorMode()を介して無効にされている場合もハングします。 SetErrorMode()を使用してWERを無効にすると、WERダイアログの「閉じる」ボタンをクリックするとプロセスが閉じます。

ハングはWindows XPでは起こりますが、Windows 7では発生しません。

SetUnhandledExceptionFilter のドキュメント>は、 'EXECEPTION_EXECUTE_HANDLER'が返されたとき、関連する例外ハンドラが実行され、通常「プロセス終了を引き起こします」と表示されますが、使用された終了メソッドのドキュメントが見つかりませんでした。

スタックトレースは、DllMain()プレリュードから呼び出されたサードパーティDLL内のオブジェクトのグローバルデストラクタでハングが発生していることを示しています。

[email protected]()  
[email protected]()  + 0xc bytes  
[email protected]()  + 0x8b bytes  
[email protected]()  + 0x12 bytes 
QtCore4.dll!QWaitCondition::wait(QMutex * mutex=0x03ad1b00, unsigned long time=4294967295)  Line 175 + 0x15 bytes   C++
QtCore4.dll!QThreadPoolPrivate::waitForDone()  Line 295 + 0x10 bytes    C++
QtCore4.dll!QThreadPool::~QThreadPool()  Line 429   C++
QtCore4.dll!QThreadPool::`vector deleting destructor'()  + 0x3d bytes   C++
QtCore4.dll!`theInstance'::`8'::`dynamic atexit destructor for 'cleanup''()  + 0x14 bytes   C++
QtCore4.dll!_CRT_INIT(void * hDllHandle=0x02b2b2d0, unsigned long dwReason=45265416, void * lpreserved=0x02b2b208)  Line 446    C
QtCore4.dll!__DllMainCRTStartup(void * hDllHandle=0x67000000, unsigned long dwReason=0, void * lpreserved=0x00000000)  Line 557 + 0x8 bytes C
QtCore4.dll!_DllMainCRTStartup(void * hDllHandle=0x67000000, unsigned long dwReason=0, void * lpreserved=0x00000001)  Line 507 + 0xe bytes  C
[email protected]()  + 0x14 bytes   
[email protected]()  - 0xfe bytes 
[email protected]()  + 0x42 bytes    
kernel32.dll!7c81cb0e()     
[email protected]()  + 0x2f479 bytes  

私はミューテックスがその後殺されたスレッドによってロックされたと推測しますが、同様の問題を引き起こすこのような方法で実行されるかもしれない他の種類のグローバルctors/dtorsを想像することができます。私の質問は次のとおりです:

  • WERが SetErrorMode()を介して無効にされている場合、クラッシュ時に ExitProcess()
  • Windows XPとWindows 7間のデフォルト例外ハンドラの動作の変化を知っている人はいますか?
  • ExitProcess()が予期された動作である場合、サードパーティのDLLでこの問題を処理する最も安全な方法は何ですか?ブレークパッド例外ハンドラから TerminateProcess()を呼び出すと、問題は解決しますが、注意すべき点はありますか?
2
これは典型的なものではなく、TerminateProcessを使用します。また、ガードプロセスを持つ方が、MiniDumpWriteDumpを呼び出してプロセスを終了する方が良い。名前付きミューテックスでそれを通知します。
追加された 著者 Hans Passant,
私が使用している正確な SetErrorMode()の呼び出しは次のようになります: DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX); SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
追加された 著者 Robert Knight,
また、 SetUnhandledExceptionFilter の正確な使用方法については、 Googleのブレッドパッドのコード
追加された 著者 Robert Knight,
追加された 著者 Robert Knight,

1 答え

「XPとWindows 7の間で何が変わったのか」と答えるには、次の点が関連しています:「x64のユーザーモードコールバック例外が消えるケース」、 http:// blog .paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-on-load-exception-user-mode-callback-exceptions-x64/

0
追加された