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