我正在写一个小工具(VC 2010,没有clr),它使用第三方库完成一个简单的任务(光栅化)。稍后的实用程序将被更大的应用程序使用。有时,实用程序会因为第三方库中的某些堆损坏而崩溃。这是好的,但Windows (Vista/2008)显示众所周知的对话框“程序已停止工作...关闭/调试程序”。这在我的情况下是不合适的(服务器端)。实用工具应该在没有任何可见效果的情况下无声地崩溃/终止。
为此,我安装了SEH for unhandled (SetUnhandledExceptionFilter)。对于AV ( *(PDWORD ) 0 =0)这样的异常,处理程序可以很好地调用,但由于某些原因,在堆损坏的情况下不会调用它。卸载其中一个第三方库dll时,dllmain中发生损坏。
有几个问题。有人能解释为什么没有调用处理程序吗?有没有其他方法可以阻止这种对话?
发布于 2017-04-05 02:09:12
显然,用户定义的异常处理程序不能捕获堆损坏,即使它们是作为具有自己的异常代码(0xC0000374 "STATUS_HEAP_CORRUPTION")的异常发出的。这是一个Visual C++错误报告,它基本上被关闭为“将不会修复”:
正如您所发现的,这不是编译器或操作系统中的错误。函数导致的堆损坏将被视为严重错误,并且作为处理该错误的一部分,操作系统将终止该进程。这就是导致异常处理程序不被调用的原因。
我猜Windows错误报告或其他创建崩溃转储的方法仍然可以捕获它。
至于阻止对话框,在注册表中,您可以完全禁用WER,也可以仅禁用对话框,这样进程就不会阻塞:
发布于 2011-12-07 14:46:26
,但由于某些原因,它在堆损坏的情况下不会被调用。卸载其中一个第三方库dll时,dllmain中发生损坏。
堆损坏是未定义的行为。它可能会抛出异常,也可能不会抛出异常。如果一个有缺陷的第三方库弄乱了你的堆,那么问题是“为什么你一开始就允许他们弄乱你的堆?”
每当进程异常终止时,都会显示“程序已停止工作”对话框。并非所有异常进程终止都是由异常引起的。许多错误(例如堆栈溢出、堆栈未对齐等)导致进程立即终止,这可能会显示该消息,但不会给您处理错误的机会。
(另外,请参阅上面Hans的精彩评论)
https://stackoverflow.com/questions/8411228
复制相似问题