【发布时间】:2010-08-09 04:58:34
【问题描述】:
我有一个用 C++ 编写的非常大、复杂(百万+ LOC)的 Windows 应用程序。我们每天都会收到一些关于应用程序已锁定并且必须强制关闭的报告。
虽然我们有大量关于崩溃的报告,但我想将其扩展为包括这些挂起场景 - 即使有大量日志记录,我们也无法找到其中一些问题的根本原因。我们可以清楚地看到活动在哪里停止 - 但不是为什么它停止了,即使在评估所有线程的输出时也是如此。
问题在于检测何时发生挂起。到目前为止,我能想到的最好的方法是看门狗线程(因为我们有证据表明后台线程会继续运行而没有问题),它会定期用自定义消息 ping 主窗口,并确认它是在一个及时时尚。这只会捕获 GUI 线程挂起,但这似乎是其中大多数发生的地方。如果在可配置的时间范围内未收到回复,我们将捕获内存和堆栈转储,并为用户提供继续等待或重新启动应用程序的选项。
有没有人知道比以这种方式定期轮询主窗口更好的方法?它看起来非常笨拙,但我还没有看到可以在我们的平台上运行的替代方案——Windows XP 和 Windows 2003 Server。我看到 Vista 对此有更好的工具,但不幸的是,这对我们没有帮助。
可以说,我们已经对此进行了广泛的诊断,并且只取得了有限的成功。请注意,实时附加 windbg 不是一种选择,因为我们要到事件发生数小时或数天后才能获得报告。我们将能够检索内存转储和日志文件,但仅此而已。
任何超出我上述计划的建议将不胜感激。
【问题讨论】:
-
当它挂起时所有线程都锁定了吗?应用是否继续生成日志文件?
-
您希望应用程序本身检测到它已挂起还是有一个单独的进程来监控应用程序选项?
-
该应用程序确实 - 在大多数情况下 - 继续在主窗口以外的其他线程中生成日志记录。在极少数情况下,似乎所有日志记录都跨线程停止。我们希望让应用程序进行自我监控。