gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:49 24 4
gpt4 key购买 nike

我正在编写一个小型实用程序(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com