【问题标题】:Debug unhandled exceptions in WPF在 WPF 中调试未处理的异常
【发布时间】:2013-09-12 18:27:53
【问题描述】:

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

结构非常简单。有一个服务器有 2 种方法。 SetMessage("字符串");和 GetMessage("String");

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

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

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

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 分钟,试图在这里找到任何类似的问题,但所有解决方案都已应用于我的代码中)

感谢您的帮助。

【问题讨论】:

  • 将抛出异常的代码(可能是您传递给调度程序的new Action)包装在try/catch 中,并在catch 块中的异常对象上调用Exception.ToString()。把它保存在某个地方。将其转储到磁盘,无论如何。还要记住,跨越线程边界的异常会破坏你的整个应用程序。但没有例外的细节......谁知道呢?
  • 是的,谢谢你,@Will。我会尝试。然而这就是问题所在,看起来我在线程之间,我实际上无法分辨是什么以及在哪里抛出哔哔声。我真的不知道是哪一种引发了异常。
  • 您的第一步是追踪该异常对象。包装您怀疑使用它抛出的任何代码。一旦您获得完整的异常详细信息(您将从 ToString() 获得),edit 并在此处添加信息。或者你可能会找到你的解决方案。
  • 您没有故障转储吗? stackoverflow.com/questions/3263813/…

标签: c# wpf wcf video


【解决方案1】:

我认为您正在某个地方使用它自己的调度程序开始一个新线程
请看一下msdn在这个链接上给出的评论
http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx

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

只是为了提供信息,即使您正在实现所有这些异常处理程序,您也无法使用它自己的调度程序捕获错误

希望对你有帮助

【讨论】:

  • 嗯,这很有趣。我的主要问题是,我无法找到跟踪堆栈。你猜怎么着?我找到了。但不是在 WER 文件夹中,而是随机查看事件日志。它就在那里——砰!所以谢谢,你展示了正确的方法。我乱码太多,线程池使用不当。
【解决方案2】:

毕竟这很容易。

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

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

问题是在线程池中的工作中产生了异常。

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2013-06-01
    • 2013-04-25
    相关资源
    最近更新 更多