如何捕获调试时不会发生的异常?

时间:2009-03-31 14:39:08

标签: wpf visual-studio-2008 debugging

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

我已经尝试将try / catch块放在任何看似相关的代码周围,并记录出现的任何错误,但无济于事 - 它不知何故一直滑过我,我不知道还能在哪里看。< / p>

我希望使用调试器是设置调试器的异常捕获行为,以便在抛出任何异常时中断,但由于我无法在调试时发生异常,我无法找到我的代码抛出的位置

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

有关如何进行的任何建议?

修改

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

3 个答案:

答案 0 :(得分:2)

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

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

因为在您的特殊情况下,您正在处理Dispatcher(未实现EndInvoke),您将必须处理Dispatcher.UnhandledException事件以捕获在委托执行期间抛出的任何异常

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

答案 1 :(得分:1)

如果你从来没有抓过它,你怎么能确定这是一个例外?

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

答案 2 :(得分:-1)

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