Ned*_*Ned 4 crash-reports watchdog crash-dumps
我正在使用一个有点不可靠的(Qt/windows)应用程序,部分是由第三方为我们编写的(只是试图将责任转移到那里).他们的最新版本更稳定.有点.我们收到的崩溃报告越来越少,但是我们收到很多关于崩溃的报告并且永远不会回来.情况多种多样,由于我们可以收集的信息很少,我们无法重现这些问题.
理想情况下,我想创建某种看门狗,注意到应用程序已锁定,并提供向我们发送崩溃报告.好主意,但有问题:
看门狗如何知道该过程已挂起?据推测,我们会对应用程序进行检测,以便定期对看门狗说"一切正常",但是我们在哪里放置它以保证频繁发生,但不太可能出现在应用程序结束时的代码路径上锁定.
发生崩溃时看门狗应该报告什么信息?Windows有一个不错的调试api,所以我相信所有有趣的数据都是可访问的,但我不确定什么对于追踪问题有用.
你想要一个minidump的组合(如果你不想添加你自己的迷你转储生成代码,使用DrWatson创建这些)和userdump来触发挂起时创建minidump.
关于自动检测挂起的事情是,当某些事情挂起以及它只是缓慢或被IO等待阻止时很难确定.我个人更喜欢允许用户在认为应用程序挂起时故意将其崩溃.除了更容易(我的应用程序不经常挂起,如果有的话:)),它也有助于他们"成为解决方案的一部分".他们喜欢这样.
首先,查看关于故障转移和符号的经典bugslayer文章,该文章还提供了一些有关这些事情的一些优秀信息.
当您拥有转储时,在WinDBG中打开它,您将能够检查整个程序状态 - 包括线程和调用栈,寄存器,内存和函数参数.我想你会特别感兴趣的是在Windbg 中使用" 〜*kp "命令获取每个线程的callstack,并使用"!locks"命令来显示所有锁定对象.我想你会发现挂起将是由于同步对象的死锁,这很难跟踪,因为所有线程都倾向于等待WaitForSingleObject调用,但是进一步查看调用堆栈以查看应用程序线程(而不是比'框架'线程,如背景通知和网络例程).一旦你缩小了它们,就可以看到正在进行的调用,可能会向应用程序添加一些日志记录工具,以便在下次失败时为您提供更多信息.
祝好运.
PS.快速谷歌提醒我:调试死锁.(CDB是windbg的命令行)