检测应用程序挂起

Mar*_*ise 7 c++ windows

我有一个用C++编写的非常大,复杂(百万+ LOC)的Windows应用程序.我们每天收到一些应用程序已锁定的报告,必须强制关闭.

虽然我们有关于崩溃的广泛报告,但我想扩展它以包括这些挂起场景 - 即使有大量的日志记录,我们也无法找到其中一些的根本原因.我们可以清楚地看到活动停止的地方 - 但不是为什么停止,即使在评估所有线程的输出时也是如此.

问题是检测何时发生挂起.到目前为止,我能想到的最好的是一个看门狗线程(因为我们有证据表明后台线程继续运行w/out问题),它定期用自定义消息对主窗口进行ping操作,并确认它是在一个自定义消息中处理的.及时时尚.这只会捕获GUI线程挂起,但这似乎是大多数情况发生的地方.如果在可配置的时间范围内未收到回复,我们将捕获内存和堆栈转储,并为用户提供继续等待或重新启动应用程序的选项.

有没有人知道比这样定期轮询主窗口更好的方法呢?它似乎非常笨拙,但我还没有看到可以在我们的平台上运行的替代方案--Windows XP和Windows 2003 Server.我看到Vista有更好的工具,但不幸的是,这对我们没有帮助.

我只想说我们对此进行了广泛的诊断,并且只取得了有限的成功.请注意,实时附加windbg不是一种选择,因为我们在事件发生后数小时或数天才收到报告.我们将能够检索内存转储和日志文件,但仅此而已.

任何超出我上面计划的建议都将受到赞赏.

Kri*_*oks 5

答案很简单:SendMessageTimeout

使用此 API,您可以向窗口发送消息并在继续之前等待超时;如果应用程序在超时之前响应,则仍在运行,否则将挂起。