【问题标题】:How to catch an exception that won't happen while debugging?如何捕获调试时不会发生的异常?
【发布时间】:2009-03-31 14:39:08
【问题描述】:

我有一些在后台线程上运行的图像处理代码,并在使用 Dispatcher.BeginInvoke() 完成处理后更新 UI 线程上的图像控件。当我在调试器之外运行我的应用程序时,它经常崩溃。一旦我在调试器中运行它,我根本无法让它发生。显然时间上的差异足以让我现在的生活变得悲惨;-)

我尝试在任何看起来相关的代码周围放置 try/catch 块,并记录出现的任何错误,但无济于事 - 它以某种方式不断从我身边溜走,我不知道还能去哪里看。

我希望使用调试器的目的是将调试器的异常捕获行为设置为在抛出任何异常时中断,但由于在调试时我无法让异常发生,所以我无法找出我的代码在哪里抛出.

我可以附加到我崩溃的进程(因为它停留在屏幕上,只是完全没有响应),暂停调试器,并查看每个线程在代码中的位置,但这并没有真正帮助我 - 我不知道实际抛出的异常是什么。

对如何进行有什么建议吗?

编辑:

  1. 我一直在尽可能多的地方使用 System.Diagnostics.Trace.WriteLine() 和 DbgView。我可以追踪异常发生的位置,但我找不到什么异常是什么,这才是重要的。
  2. 我以前使用过 WinDBG+SOS 来追踪内存泄漏,但没有追踪难以发现的异常。任何人都可以建议以这种身份使用 WinDBG+SOS 的资源吗?

【问题讨论】:

  • 在调试或发布版本(配置)中,在没有附加调试器的情况下会崩溃吗?
  • 在我们拥有活跃的调试器之前,我们是如何调试软件的?现在的孩子们应该学习针对这种情况的无调试器调试。
  • 您对 WinDBG+SOS 的体验如何?您可以使用这些工具来查找异常。
  • @Welbog,尽量不要侮辱。如果我能投票给你,我会的。你根本没有帮助。我正在尝试几种不同的无调试器技术,我正在寻找更多我可能不熟悉的技术。
  • @Shay Erlichmen,您能否建议任何有助于追踪异常的 WinDBG+SOS 资源?我以前用过WinDBG,但要追踪内存泄漏。

标签: wpf visual-studio-2008 debugging


【解决方案1】:

除了少数例外,每个BeginInvoke 都应该有一个对应的EndInvoke 对应项(请参阅此处了解more details why,一个例外是例如Control.BeginInvoke)。

缺少EndInvoke 可能是主线程未捕获异常并且您的应用程序终止的原因。

由于在您的特殊情况下您正在处理Dispatcher(它不实现EndInvoke),因此您必须处理Dispatcher.UnhandledException 事件以捕获执行委托期间引发的任何异常。

顺便说一句,监控System.Diagnostics.Trace 消息的好工具是来自Sysinternals 的DbgView

【讨论】:

  • 对DbgView很熟悉,不,BeginInvoke的每次调用都需要对应的EndInvoke调用。查看 Dispatcher 的文档 - 没有 EndInvoke 方法。
  • 似乎您适合 Control.EndInvoke,但通常需要调用 EndInvoke 才能不泄漏任何资源和正确处理异常。请参阅我的答案中的更新。
  • 对 - 我应该指定,我正在使用 Canvas.Dispatcher。不过,我不知道 Dispatcher.UnhandledException,我会调查一下,谢谢!
【解决方案2】:

当你从未发现它时,你怎么能确定它是一个例外?

此外,不要将 try/catch 块放置在各处,而是将它们放置在边界处,尤其是线程边界处。将它们放在任何 ThreadStart 方法或由 BeginInvoke 调用的其他代码或回调方法等周围。

【讨论】:

  • 原来是我的图像处理代码出现了死锁。感谢您的建议,否则我会花更多时间认为这是一个未处理的异常!
【解决方案3】:

您可以在应用程序启动时调用的静态 Main 中放置一个 try/catch 吗?因此,当应用程序崩溃时,您可以在某处输出堆栈跟踪和异常信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2021-05-25
    • 2017-01-23
    相关资源
    最近更新 更多