我有一个用C++编写的非常大,复杂(百万+ LOC)的Windows应用程序.我们每天收到一些应用程序已锁定的报告,必须强制关闭.
虽然我们有关于崩溃的广泛报告,但我想扩展它以包括这些挂起场景 - 即使有大量的日志记录,我们也无法找到其中一些的根本原因.我们可以清楚地看到活动停止的地方 - 但不是为什么停止,即使在评估所有线程的输出时也是如此.
问题是检测何时发生挂起.到目前为止,我能想到的最好的是一个看门狗线程(因为我们有证据表明后台线程继续运行w/out问题),它定期用自定义消息对主窗口进行ping操作,并确认它是在一个自定义消息中处理的.及时时尚.这只会捕获GUI线程挂起,但这似乎是大多数情况发生的地方.如果在可配置的时间范围内未收到回复,我们将捕获内存和堆栈转储,并为用户提供继续等待或重新启动应用程序的选项.
有没有人知道比这样定期轮询主窗口更好的方法呢?它似乎非常笨拙,但我还没有看到可以在我们的平台上运行的替代方案--Windows XP和Windows 2003 Server.我看到Vista有更好的工具,但不幸的是,这对我们没有帮助.
我只想说我们对此进行了广泛的诊断,并且只取得了有限的成功.请注意,实时附加windbg不是一种选择,因为我们在事件发生后数小时或数天才收到报告.我们将能够检索内存转储和日志文件,但仅此而已.
任何超出我上面计划的建议都将受到赞赏.
归档时间: |
|
查看次数: |
4069 次 |
最近记录: |