c++ - 检测应用挂起

标签 c++ windows

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

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

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

有谁知道比以这种方式定期轮询主窗口更好的方法吗?它看起来笨拙得令人痛苦,但我还没有看到可以在我们的平台(Windows XP 和 Windows 2003 Server)上运行的替代方案。我看到 Vista 对此有更好的工具,但不幸的是这对我们没有帮助。

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

如有超出我上述计划的任何建议,我们将不胜感激。

最佳答案

答案很简单:SendMessageTimeout!

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

关于c++ - 检测应用挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917909/

相关文章:

python - "WindowsError: [Error 5] Access is denied"使用 urllib2

字符串流istringstream的C++问题

c++ - 从 C++ 文件中获取输入

c++ - 更改字符集后 MFC 应用程序的视觉外观发生变化

windows - 如何将 session 导入 MobaXterm?

python - 无法使用Python连接到MSSQL Server数据库

c++ - 模板、STL、C++

c++ - 带有作用域链的 JS_EvaluateScript

windows - std::condition_variable notify_all 不会同时唤醒所有线程

windows - Windows 版发送邮件