【问题标题】:Crash reporting watchdog for when my application locks up on a customer's machine当我的应用程序锁定在客户的机器上时,崩溃报告看门狗
【发布时间】:2009-04-16 12:10:31
【问题描述】:

我正在使用一个有些不可靠的(Qt/windows)应用程序,部分是由第三方为我们编写的(只是想把责任推到那里)。他们的最新版本更稳定。有点。我们收到的崩溃报告越来越少,但我们收到很多关于它只是挂起并且永远不会回来的报告。情况千差万别,由于我们收集到的信息很少,我们无法重现问题。

因此,理想情况下,我想创建某种看门狗,它会注意到应用程序已锁定,并主动向我们发送崩溃报告。好主意,但有问题:

  • 看门狗如何知道进程已挂起?大概我们检测应用程序以定期向看门狗说“一切正常”,但是我们应该把它放在哪里,以保证它足够频繁地发生,但不太可能在应用程序结束时的代码路径上锁定。

  • 当崩溃发生时看门狗应该报告什么信息? Windows 有一个不错的调试 api,所以我相信所有有趣的数据都可以访问,但我不确定什么对追踪问题有用。

【问题讨论】:

    标签: crash-dumps crash-reports watchdog


    【解决方案1】:

    您想要一个 minidump(如果您不想添加自己的 minidump 生成代码,请使用 DrWatson 创建这些)和 userdump 的组合,以便在挂起时触发 minidump 创建。

    关于自动检测挂起的事情是,它很难确定什么时候挂起,什么时候它只是缓慢或被 IO 等待阻塞。我个人更喜欢允许用户在他们认为它挂起时故意让应用程序崩溃。除了更容易(我的应用程序不会经常挂起,如果有的话:)),它还有助于他们“成为解决方案的一部分”。他们喜欢这样。

    首先,查看有关故障转储和符号的经典 bugslayer article,其中还包含有关这些事情发生了什么的一些极好的信息。

    其次,获取userdump,它允许您创建转储,instructions 用于设置它以生成转储

    获得转储后,在 WinDBG 中打开它,您将能够检查整个程序状态 - 包括线程和调用堆栈、寄存器、内存和函数参数。我想你会对在 Windbg 中使用“~*kp”命令获取每个线程的调用堆栈以及使用“!locks”命令显示所有锁定对象特别感兴趣。我想你会发现挂起是由于同步对象的死锁造成的,这将很难追踪,因为所有线程都倾向于等待 WaitForSingleObject 调用,但进一步查看调用堆栈以查看应用程序线程(而不是而不是像后台通知和网络例程这样的“框架”线程)。缩小范围后,您可以查看正在进行的调用,可能会在应用中添加一些日志记录工具,以尝试在下次失败时为您提供更多信息。

    祝你好运。

    附言。快速谷歌让我想起了这一点:Debugging deadlocks。 (CDB 是相当于windbg 的命令行)

    【讨论】:

      【解决方案2】:

      您可以使用 Microsoft 的 Windows 调试工具中的 ADPlus 来识别挂起。当进程挂起或崩溃时,它将附加到您的进程并创建一个转储(迷你或完整)。

      WinDbg 是可移植的,不必安装(不过您必须配置符号)。您可以创建一个特殊的安装程序,它将使用批处理启动您的应用程序,它还将在您的应用程序启动后运行 ADPlus(ADPlus 是一个命令行工具,因此您应该能够找到一种方法以某种方式将其合并)。

      顺便说一句,如果您确实找到了一种方法来识别内部挂起并且能够使进程崩溃,您可以注册 Windows Error Reporting 以便将崩溃转储发送给您(如果用户允许的话)。

      【讨论】:

        【解决方案3】:

        我认为单独的应用程序执行监视可能会产生比它解决的问题更多的问题。我建议相反,您首先创建处理程序以在应用程序崩溃时生成小型转储,然后向应用程序添加一个看门狗线程,如果应用程序脱轨,它将故意崩溃。看门狗线程(相对于不同的应用程序)的优势在于,看门狗应该更容易确定应用程序是否已脱轨。

        拥有 MiniDump 后,您可以四处寻找应用程序死机时的状态。这应该可以为您提供足够的线索来找出问题所在,或者至少为下一步寻找方向。

        CodeProject 上有一些关于MiniDumps 的资料,这可能是一个有用的例子。 MSDN 也有关于它们的更多信息。

        【讨论】:

        • 您不必为了创建小型转储而使应用程序崩溃。您可以随时调用 MiniDumpWriteDump()。
        【解决方案4】:

        不要打扰看门狗。订阅 Microsoft 的 Windows 错误重现 (winqual.microsoft.com)。他们会为您收集堆栈跟踪。事实上,他们今天很可能已经这样做了。在您注册之前,他们不会分享它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-19
          • 2020-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多