调试 WPF 中未经处理的异常

本文关键字:处理 异常 WPF 调试 | 更新日期: 2023-09-27 18:31:10

我有一个复杂的WPF应用程序,用于某种PA系统。它会不时显示视频,有时它会在屏幕上播放音乐和不同的短信。

结构非常简单。有一个服务器有 2 种方法。设置消息("字符串");和获取消息("字符串");

客户端每 5 秒一次通过 WCF 上的 HTTP 绑定连接到服务器并拉取 GetMessage()。管理应用程序连接到服务器并调用 SetMessage()。

在应用程序中.xml.cs我有一个用于CurrentDomain_UnhandledException,OnDispatcherUnhandledException,TaskScheduler.UnobservedTaskException和应用程序的处理程序。Current.DispatcherUnhnandledException. 他们都假设做 nlog 并继续操作。

应用程序中有一个页面使用媒体元素播放短视频。播放视频后,我有时会遇到应用程序崩溃。

EventType : clr20r3
P1        : Client.exe
P2        : 0.0.2.0
P3        : 5226863e
P3        : mscorlib
P5        : 4.0.0.0
P6        : 4ba1da6f
P7        : 219
P8        : 10
P9        : system.invalidoperaionexception

现在这一切都很酷。然而,问题是:

  1. 尽管有 4 个不同的异常处理程序,我仍然得到异常
  2. 我无法在客户端计算机上进行调试
  3. 错误是随机的,但在我播放视频后发生。
  4. 停止和启动视频的代码位于 Dispatcher.Invoke(new Action) 中。
  5. 我可能会离开页面并切换到另一个页面,然后再停止视频。

看起来我只是违反了某些访问权限并试图从另一个线程更改代码中的某些内容。

有趣的是,我尝试做ILDasm并找到P7:219,代码中没有。

有没有办法抓住那个可怕的异常?

(我实际上花了大约 30 分钟,试图在这里找到任何类似的问题,但所有解决方案都已经应用于我的代码中)

感谢帮助。

调试 WPF 中未经处理的异常

我认为您在某个地方使用自己的调度程序
启动一个新线程请查看MSDN在此链接
上的评论http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx

调度程序未处理异常由应用程序针对主 UI 线程上运行的代码未处理的每个异常引发。 如果未在后台用户界面 (UI) 线程(具有自己的调度程序的线程)或后台工作线程(没有调度程序的线程)上处理异常,则异常不会转发到主 UI 线程。因此,不会引发调度程序未处理异常。在这些情况下,您将需要编写代码来执行以下操作: 处理后台线程上的异常。 将这些异常调度到主 UI 线程。 在主 UI 线程上重新抛出它们而不处理它们以允许引发调度程序未处理异常。

仅供参考,即使您正在实现所有这些异常处理程序,您也无法使用它自己的调度程序捕获错误

希望这能帮助你

毕竟这很容易。

我没有跟踪堆栈来找出问题所在。我尝试做nlog,WER和许多其他事情,但我没有得到真正的跟踪堆栈。

当出于兴趣,我决定检查Windows日志时,我发现在记录错误后Windows确实记录了堆栈跟踪!它允许我在几秒钟内找到错误。

问题出在线程池中的工作中生成的异常。