c++ - 结构化异常处理程序 (SEH) 不会捕获堆损坏

标签 c++ exception heap-corruption seh structured-exception

我正在编写一个小型实用程序(VC 2010,无 clr),它使用第 3 方库执行一项简单的任务(光栅化)。后来的实用程序将被更大的应用程序使用。有时,该实用程序会因第 3 方库中的某些堆损坏而崩溃。没关系,但 Windows (Vista/2008) 显示众所周知的对话框“程序已停止工作...关闭/调试程序。”这对我来说不合适(服务器端)。实用程序应该在没有任何可见效果的情况下静默崩溃/终止。

为此,我为未处理的异常安装了 SEH (SetUnhandledExceptionFilter)。对于像 AV ( *(PDWORD)0 = 0 ) 这样的异常,可以完美地调用该处理程序,但由于某种原因,它不会在堆损坏的情况下被调用。在卸载第 3 方库 dll 之一的 dllmain 时发生损坏。

几个问题。谁能解释为什么不调用处理程序?还有其他方法可以防止该对话吗?

最佳答案

显然,用户定义的异常处理程序无法捕获堆损坏是有意为之的,即使它们是作为具有自己的异常代码(0xC0000374“STATUS_HEAP_CORRUPTION”)的异常发出的。这是一个 Visual C++ 错误报告,它基本上被关闭为“不会修复”:

https://connect.microsoft.com/VisualStudio/feedback/details/664497/cant-catch-0xc0000374-exception-status-heap-corruption

As you have discovered, this is not a bug in the compiler or the OS. The heap corruption that your function causes is treated as a critical error, and as part of handling that error the OS terminates the process. This is what causes your exception handlers to not be invoked.

我猜 Windows 错误报告或其他创建故障转储的方法仍然可以捕捉到它。

至于阻止对话,您可以在注册表中完全禁用 WER 或仅禁用对话,这样进程就不会阻塞:

https://msdn.microsoft.com/de-de/library/windows/desktop/aa366711(v=vs.85).aspx (参见“DontShowUI”)

关于c++ - 结构化异常处理程序 (SEH) 不会捕获堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8411228/

相关文章:

java - 扑克游戏中未处理的异常

c - sizeof(structname) 这是错的吗?

c++ - CLR4 托管接口(interface)导致堆损坏?

c++ - 如何在任意依赖类型上专门化模板

c++ - 如何乘以矩阵?

Python:为什么我不能遍历列表?我的异常类很无聊吗?

c# - .NET 4 : Can the managed code alone cause a heap corruption?

c++ - 有没有办法在容器中存储不同的函数指针类型

C++在派生类中事后指定变量类型

c# - JetBrains.ReSharper.TaskRunnerFramework.dll 中的“System.IO.EndOfStreamException”