0

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

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

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

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

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

  1. 如何检测挂起或被 Window 检测到我挂起?请注意,我假设它可能是一个更高优先级的线程阻塞了我的 UI 线程;所以,我可能无法回复 Windows 消息。
  2. 一旦我进入,我如何找出罪魁祸首。能够记录其调用堆栈将是一个很大的优势。
4

2 回答 2

0

也许过于简单,但是将调试器附加到进程,执行“Break All”然后检查各个线程的堆栈跟踪怎么样?

于 2012-12-13T19:47:21.410 回答
0

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

于 2013-03-29T17:20:53.467 回答