【问题标题】:How to Debug WPF Exceptions that don't have Your Code in the Stack Trace?如何调试堆栈跟踪中没有您的代码的 WPF 异常?
【发布时间】:2012-01-11 19:17:25
【问题描述】:

我们的代码会产生以下未处理的异常:

错误消息:System.Reflection.TargetParameterCountException: 参数计数不匹配。

在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化、 布尔型 skipVisibilityChecks)

在 System.Delegate.DynamicInvokeImpl(Object[] args)

在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象参数,Int32 numArgs)

在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象 源,委托方法,对象参数,Int32 numArgs,委托 捕获处理程序)。堆栈跟踪: System.Reflection.TargetParameterCountException:参数计数 不匹配。

在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,Binder binder,Object[]参数, CultureInfo 文化,布尔型 skipVisibilityChecks)

在 System.Delegate.DynamicInvokeImpl(Object[] args)

在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象参数,Int32 numArgs)

在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象 源,委托方法,对象参数,Int32 numArgs,委托 catchHandler)。

我们知道这种情况何时发生。我们正在向 UI 绑定的 ObservableCollection 添加一个项目。但是,鉴于错误很少发生,我们无法解释为什么会发生这种情况,或者如何解决它。由于它是一个零星的问题,它不太可能是绑定或 DataTemplates 中的某种错字,因为这些错误“每次”都会出错。在我们的代码中,我们没有使用反射或任何预期在运行时调用参数的东西;异常必须引用 Microsoft 的一些内部类。此外,堆栈跟踪仅包含 Microsoft 代码;我们一直无法在堆栈跟踪本身(即 System.Windows.Threading.ExceptionWrapper)中找到许多类的任何文档。我们如何调试这种错误?有没有办法在这些内部 Microsoft 类中放置某种断点,以便我们可以看到哪些类型的输入触发了这种行为?

【问题讨论】:

  • 要检查的一件事:您确定只访问 UI 线程上的 ObservableCollection 吗?即使您锁定了对集合的访问,ObservableCollection 通知也不是线程安全的。
  • 在这种情况下我们不会得到一个相当具体的非法跨线程异常吗?
  • @GWLIosa,如果您启用了特定的托管调试助手,则可能。即使那样,我也不确定 ObservableCollection 的绑定系统是否被该助手覆盖(它最初是为 WinForms 构建的,用于检测来自非 UI 线程的 Control 属性访问。)我刚刚提到它,因为它可能很容易检查和每当我遇到间歇性故障时,我的第一个怀疑就是线程竞争条件。
  • 请将代码发布在您怀疑它正在死去的地方。你没有回答丹·布莱恩特的问题。您是否在拥有 UI 的线程以外的线程上更新 ObservableCollection?根据经验,您将收到中间错误,并且可能没有有意义的错误消息。由一个线程来询问它是否拥有 UI。如果它不询问并且有时会尝试后台线程成功更新 UI。如果您在拥有 UI 的线程以外的线程上更新任何 UI 源,请尝试使用 BackgroundWorker

标签: .net wpf error-handling


【解决方案1】:

您可以通过捕获故障转储来确定应用死​​机时发生的情况。

查看此问题了解更多信息

How do I obtain a crash dump

【讨论】:

  • 我们非常清楚应用程序在死/死时的“最新情况”;问题是我们无法弄清楚为什么会导致它死亡。我们有堆栈跟踪,从崩溃(在问题中提到)我们只是在某个时候“丢失”了跟踪,我猜。
  • 通过转储,您应该能够获得崩溃时各种对象的状态,这可能有助于您找出崩溃的原因
  • 知道了;事实证明,当某些事情(它不应该真正关心)为空时,第 3 方绘图控件会死掉,这可能会不时发生):
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2018-12-03
  • 2011-01-05
  • 2011-10-21
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多