SetUnhandledExceptionFilterを使用して(google breakpadを介して)カスタム例外ハンドラーをセットアップするアプリケーションが、ブレークパッド例外ハンドラーがクラッシュをキャッチし、ミニダンプファイルを保存し、SetUnhandledExceptionFilter関数からEXCEPTION_EXECUTE_HANDLERを返し、標準を実行した後、ハングしている状況があります。例外ハンドラ。フィルタ関数がEXCEPTION_CONTINUE_SEARCHを返し、Windowsエラー報告ダイアログがSetErrorMode()によって無効にされている場合にも、ハングが発生します。SetErrorMode()を使用してWERを無効にしない場合、ユーザーがWERダイアログの[閉じる]ボタンをクリックすると、プロセスが閉じます。
ハングはWindowsXPで発生しますが、Windows7では発生しません。
SetUnhandledExceptionFilterのドキュメントには、「EXECEPTION_EXECUTE_HANDLER」が返されると、関連する例外ハンドラーが実行され、「通常はプロセスが終了する」と記載されていますが、使用される終了メソッドのドキュメントが見つかりませんでした。
スタックトレースは、DllMain()プレリュードから呼び出されたサードパーティDLLのオブジェクトのグローバルデストラクタでハングが発生していることを示しています。
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_NtWaitForSingleObject@12() + 0xc bytes
kernel32.dll!_WaitForSingleObjectEx@12() + 0x8b bytes
kernel32.dll!_WaitForSingleObject@8() + 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
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_LdrShutdownProcess@0() - 0xfe bytes
kernel32.dll!__ExitProcess@4() + 0x42 bytes
kernel32.dll!7c81cb0e()
kernel32.dll!_BaseThreadStart@8() + 0x2f479 bytes
ミューテックスはその後強制終了されたスレッドによってロックされたと思いますが、この方法で実行される可能性のある他の種類のグローバルctor/dtorが同様の問題を引き起こす可能性があることを想像できます。私の質問は次のとおりです。
ExitProcess()
を介してWERが無効になっている場合にクラッシュが発生した場合に呼び出されるのは、予期される動作SetErrorMode()
ですか?- WindowsXPとWindows7の間で、デフォルトの例外ハンドラーの動作が変更されたことを知っている人はいますか?
- 予想される動作の場合
ExitProcess()
、サードパーティのDLLでこの問題に対処する最も安全な方法は何ですか?ブレークパッド例外ハンドラから呼び出すTerminateProcess()
と問題は修正されますが、注意すべき注意事項はありますか?