禁用崩溃报告对话框时,SetUnhandledExceptionFilter和默认异常处理程序

时间:2011-11-24 17:28:00

标签: winapi exception-handling crash-reports google-breakpad

我遇到这样一种情况:使用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()的预期行为?
  • 是否有人知道Windows XP和Windows 7之间可能相关的默认异常处理程序的行为更改?
  • 如果ExitProcess()是预期的行为,那么在第三方DLL中处理此问题的最安全的方法是什么?从breakpad异常处理程序调用{​​{1}}可以解决问题,但是我应该注意哪些警告?

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/