如何捕获有关我的应用程序“挂起”的原因的信息

时间:2012-12-13 19:42:50

标签: c# wpf

我有一个WPF监控应用程序,它使用单独的(内部开发的)C#测试 用于执行测试并监视和记录结果的基础结构。我还使用商业软件包(InGear)与PLC通信。因此,应用程序有很多线程(其中大部分是由我使用的工具创建的)。

由于环境的性质,在目标环境中使用调试器非常困难;所以,我们都使用log4net来记录诊断。

我在外部调用中使用try / catch块,并且还在WPF和AppDomain级别设置了未处理的异常处理程序。

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

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

  1. 我怎样才能检测到挂起或挂钩进入Window的检测我挂了?请注意,我假设它可能是阻止我的UI步骤的更高优先级的线程;所以,我可能无法回应Windows消息。
  2. 一旦我点击,我怎么找出什么线程是罪魁祸首。能够将日志作为其调用堆栈将是一个很大的优势。

2 个答案:

答案 0 :(得分:0)

可能过于简单,但是如何将调试器附加到进程,执行'Break All'然后检查各种线程的堆栈跟踪?

答案 1 :(得分:0)

我无法确定在Windows之前检测“挂起”的方法,我能够捕获Windows超时异常并最终将问题跟踪到Oracle .NET组件中的非托管代码。