4

在执行了一些新代码后,我的 C++ 应用程序开始表现得很奇怪(屏幕更新不正确或不完整,有时根本没有屏幕更新)。一段时间后,我们发现新代码导致了访问冲突。奇怪的是,应用程序只是继续运行(但屏幕更新不正确)。

起初我们认为问题是由“try-catch(...)”构造引起的(由一位过度活跃的前同事放在那里),但几个小时后(仔细检查调用堆栈,添加许多断点,... ) 我们发现,如果在绘制事件中存在访问冲突,Windows 会捕获它,并继续运行应用程序。

  • 这是正常行为吗?
  • Windows 在绘制事件期间捕获异常/错误是否正常?
  • 有没有办法禁用它?(如果不是,这意味着我们必须始终在调试器中运行,并在测试代码时启用所有异常)。

编辑:

  • 在 XP 上,正确的崩溃(访问冲突后想要的行为)
  • 在 Vista 和 Windows 7 上,应用程序继续运行
4

2 回答 2

2

我的直接反应是,这听起来像是资源泄漏,当您不再拥有正确类型的可用资源时会发生故障。

[我删除了之前答案的其余部分,因为根据帕特里克的评论和一些调查,它显然不适用于手头的问题。]

按照 Patrick 的评论,我做了一个快速测试并复制了 Windows 7 下的行为。我从一个真正最小的程序开始(VS 2008 为 Win32 项目生成的基本程序),添加的只是写入一个不存在的地址. 果然,你根本没有任何不好的迹象。

只是为了笑,我做了一个快速测试,看看它是如何对异常做出反应的。对于它的价值,它不会在异常之后恢复,它只是捕获它并跳过 WM_PAINT 处理程序中的其余代码。

我在 MSDN 中做了一些查看,但到目前为止还没有找到任何文档来解释这是如何发生或为什么发生的,是否可以禁用它,如果可以,如何禁用,或其他任何内容。不过我必须同意:这确实是一个严重的问题——如果我造成了访问冲突(不,不可能发生!)我希望程序尽可能彻底和快速地崩溃。掩盖错误(尤其是像访问冲突一样严重的错误)是一个非常糟糕的主意!

于 2010-05-25T12:18:06.643 回答
2

这是一个已知的缺陷。检查修补程序。http://support.microsoft.com/kb/976038

于 2010-08-05T19:03:35.680 回答