AC.*_*AC. 5 c++ exception seh structured-exception heap-corruption
我正在编写一个小型实用程序(VC 2010,无 clr),它使用第 3 方库执行一项简单的任务(光栅化)。稍后的实用程序将被更大的应用程序使用。有时,该实用程序会因第 3 方库中的某些堆损坏而崩溃。没关系,但 Windows (Vista/2008) 显示众所周知的对话框“程序已停止工作...关闭/调试程序”。这不适合我的情况(服务器端)。实用程序应该静默地崩溃/终止,没有任何可见的影响。
为此,我为未处理的异常安装了 SEH (SetUnhandledExceptionFilter)。对于 AV ( *(PDWORD)0 = 0 ) 等异常,可以完美调用该处理程序,但由于某种原因,在堆损坏的情况下不会调用该处理程序。卸载第 3 方库 dll 之一的 dllmain 时发生损坏。
有几个问题。谁能解释为什么不调用处理程序?还有其他方法可以阻止该对话框吗?
显然,堆损坏无法被用户定义的异常处理程序捕获,即使它们是用自己的异常代码(0xC0000374“STATUS_HEAP_CORRUPTION”)作为异常发出的。这是一个 Visual C++ 错误报告,基本上被关闭为“无法修复”:
正如您所发现的,这不是编译器或操作系统中的错误。您的函数导致的堆损坏被视为严重错误,并且作为处理该错误的一部分,操作系统会终止进程。这就是导致异常处理程序不被调用的原因。
我猜 Windows 错误报告或其他创建故障转储的方法仍然可以捕获它。
至于阻止该对话框,您可以在注册表中完全禁用 WER 或仅禁用该对话框,以便该进程不会被阻止:
https://msdn.microsoft.com/de-de/library/windows/desktop/aa366711 (v=vs.85).aspx(请参阅“DontShowUI”)
| 归档时间: |
|
| 查看次数: |
4415 次 |
| 最近记录: |