我遇到这样一种情况:使用SetUnhandledExceptionFilter(通过google breakpad)设置自定义异常处理程序的应用程序在breakpad异常处理程序发生崩溃后挂起,保存了一个minidump文件并从SetUnhandledExceptionFilter返回了EXCEPTION_EXECUTE_HANDLER function,执行标准异常处理程序。如果过滤器函数返回EXCEPTION_CONTINUE_SEARCH并且已通过SetErrorMode()禁用了Windows错误报告对话框,则也会发生挂起。如果SetErrorMode()不用于禁用WER,则一旦用户单击WER对话框中的“关闭”按钮,该过程就会关闭。
挂起发生在Windows XP下,但不发生在Windows 7上。
SetUnhandledExceptionFilter的文档指出,当返回'EXECEPTION_EXECUTE_HANDLER'时,关联的异常处理程序将执行“通常导致进程终止”,但我找不到所用终止方法的文档。
堆栈跟踪显示挂起发生在第三方DLL中对象的全局析构函数中,从DllMain()前奏调用。
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
我猜这个互斥锁被一个已被杀死的线程锁定,但我可以想象其他类型的全局ctors / dtor可能以这种方式执行会导致类似的问题。我的问题是:
ExitProcess()
禁用WER,是否会在发生崩溃时调用SetErrorMode()
的预期行为?ExitProcess()
是预期的行为,那么在第三方DLL中处理此问题的最安全的方法是什么?从breakpad异常处理程序调用{{1}}可以解决问题,但是我应该注意哪些警告?答案 0 :(得分:0)
要回答“XP和Windows 7之间发生了什么变化”,以下内容可能是相关的:“消失的OnLoad异常 - x64中的用户模式回调异常,”http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/。