2012-12-13 41 views
0

我有一个使用一个单独的(内部开发)C#测试 基础设施,以执行测试和监视和记录结果的WPF监控应用。我还使用商业软件包(InGear)与PLC进行通信。因此,该应用程序有很多线程(其中大部分是由我使用的工具创建的)。如何捕获为什么我的应用程序信息“挂”

因为环境的性质,这将是非常难用在目标环境中调试器;所以,我们都使用log4net来记录诊断。

我都在WPF和AppDomain的水平使用try/catch块在我的周围外部调用,也已经建立了未处理的异常处理程序。

在我们的第一个长期运行出现的应用程序已经成为不响应,我得到了标准的“没有响应”对话框。看着日志,似乎一切都停止了。例如:我可以从日志中看到DispatcherTimer被设置为在1秒内对主线程做出响应;但是,从来没有。

所以....我的问题是:

  1. 我如何检测挂起或挂接到窗口的检测,我挂?请注意,我假设它可能是更高优先级的线程,阻止了我的用户界面;所以,我可能无法回应Windows消息。
  2. 一旦我开始接触,我怎么找出什么线程是罪魁祸首。能够将日志的调用堆栈放在一个很大的优势上。
+0

我相信捕捉使用WinDbg的工具将帮助进程转储。我没有自己的工作,但你可以搜索细节。 – ryadavilli

+0

在我正在另一家公司工作的C++应用程序中,我们有两个线程互相关注,并在出现任何问题时执行崩溃转储。我也在考虑添加一个可以导入W​​inDbg的[MiniDump](http://msdn.microsoft.com/en-us/library/ms680360(VS.85).aspx)。我可能会在这里看看;但是,我必须能够首先捕捉错误。我不能在单位周围坐下来等待它崩溃。 – markshancock

回答

0

在那里我是无法确定的方式来检测“挂” Windows那样之前,我是能够赶上Windows的超时异常,并最终追查问题在Oracle .NET组件非托管代码。

0

也许是简单的,但是如何将调试器附加到进程,做一个'Break All',然后检查各个线程的堆栈跟踪?

+0

由于环境的性质,在目标环境中使用调试器将非常困难。它与之通话的设备位于专用局域网上,只能由目标PC访问,而Visual Studio不在该PC上。我可能能够远程调试它;但是,我从来没有这样做过,所以我不得不弄清楚。而且,上次在应用程序挂起之前花了4个小时的运行时间;所以,我真的不想捆绑我的电脑那么久。 – markshancock

相关问题