我正与一个有些不可靠的(脱/windows)应用程序部分写入我们通过第三方(只是试图推卸责任那里)。他们的最新版本更加稳定。排序。我们得到较少的报告的崩溃,但我们越来越多的报告它只是挂永远不会回来了。情况是多种多样的,并且与小信息,我们可以收集,我们没有能够重现的问题。

所以理想的是,我想建立某种形式的看门狗,它注意的应用程序有关起来,并提供发送一个崩溃的报告回给我们。不错的主意,但也有问题:

  • 怎么看门狗知道的过程中已经挂?大概是我们的仪器应用程序来定期说"所有确定"看门狗,但是,在我们把这样,它的保证来发生的足够频繁,但是可能不是一个路径代码的应用程序结束时,它是锁着的。

  • 什么样的信息应该看门狗报告崩溃时会发生什么?Windows有一个体面的调试api,因此我相信,所有感兴趣的数据,但是我不确定什么是有用的,用于跟踪问题。

有帮助吗?

解决方案

你想要一个组合的一个转储(使用DrWatson创建这些如果你不想加入你自己的小型抛代码)和用户转储到触发一个转储创造一个挂起。

事关自动检测挂的是,它很难决定的时候有些事情悬而当它只是缓慢或阻止通过IO等待。我个人比较喜欢以允许用户到崩溃的程序蓄意当他们认为其挂。除了是一个容易得多(我的应用往往不会挂通常,如果在所有:)),它还有助于他们"可以部分解决办法"。他们喜欢这样。

首先,检查了经典的 bugslayer的文章 关于crashdumps和符号,这也有一些优秀的信息,关于什么在这些事情。

第二,获得 用户转储 它允许你创建的垃圾场, 指令 对于设置它生成垃圾场

当你有的垃圾场,打开它在WinDBG,你将能够检查整个程序的国家包括螺纹和调用堆栈、寄存器、存储器和参数的功能。我认为你会是特别有兴趣使用的"~*kp"命令在Windbg得到的调用栈的每一个线程,以及"!锁"的命令显示所有的锁定对象。我想你会发现悬挂会由于僵局的同步的对象,这将会很难追查所有的线往往会等待一个WaitForSingleObject电话,但是期待进一步下调用堆栈看到的应用程序线(而不是'框架'的线喜欢背景的通知和网络程序).一旦你已经缩小下来,你可以看到什么叫正在做出的、可能增加一些记录仪器的应用程序,以试着给你更多的信息,准备下一次失败。

好运气。

Ps。快速的谷歌提醒我这一点: 调试僵局.(CDB是命令行相当于windbg)

其他提示

你可以使用 ADPlus 从Microsoft的Windows的调试工具的识别挂起。它将连接到你的过程,并创建一个垃圾场(小型或全)当的进程挂起或崩溃。

WinDbg是便携式的,并不具有以安装(你必须配置符号,尽管).你可以创建一个特殊的安装,将启动的应用程序使用的一批次,其中还将运行ADPlus后你的应用程序的开始(ADPlus是命令行的工具,所以你应该能够找到一种方法纳入它在某种程度上).

顺便说一句,如果您找到一种方法来识别挂境内和能崩溃的过程中,可以注册 Windows错误报告 因此,崩溃转储将发送给你的(应用户允许的话)。

我认为一个单独的程序做watchdogging可能产生更多的问题比它解决了。我建议,而是,首次创建处理程序,以产生最小转储当程序的崩溃,再加入一个看门狗线应用程序,这将故意的崩溃,如果应用程序进出轨。优点的看门狗线(vs一个不同的应用程序)的是,它应该更容易看门狗知道为确保程序已经脱轨。

一旦你的小型转储,你可以闲逛,找出应用的状态的时候死了。这应该给你足够的线索找出问题,或至少在哪里看下一步。

有一些东西在演示关 小型转储, ,这可能是一个有用的例子。MSDN有更多的有关它们的信息。

不要打扰一个看门狗。订阅Microsoft的Windows的错误Reproting(winqual.microsoft.com).他们会收集栈跟踪你。事实上,这是很有可能他们已经这样做;他们不分享他们直到你报名参加。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top