【问题标题】:Debugging Invoked function in .NET在 .NET 中调试调用的函数
【发布时间】:2011-05-16 16:16:30
【问题描述】:

我在 .NET 中使用反射 (Method.Invoke) 调用函数。如果此方法内部发生错误并引发异常,则调试器不会显示实际代码,而是在 Invoke() 调用时停止。我可以从 InnerException 检索异常信息,但这与使用调用堆栈等进行常规调试相比非常不方便。可以像常规函数调用一样调试使用 Method.Invoke 调用的方法吗?

【问题讨论】:

  • @Pawcio - 为什么是这个赏金? (你永远找不到更“有信誉的来源”......)
  • 不知道您所说的“信誉良好的来源”是什么意思,但答案并没有真正得到回答,我想知道这是否可能,因为这种调试行为非常烦人。

标签: .net visual-studio debugging reflection invoke


【解决方案1】:

您喜欢点击“Just My Code”功能。默认情况下,调试器将调试限制为被认为是由开发人员编写的代码。这减少了在调试 WPF 或 WinForms 启动时会出现的大量噪音。

为了让所有代码都运行异常助手等项目,您应该禁用 Just My Code。

  • 工具 -> 选项
  • 调试器
  • 取消选中“仅启用我的代码调试”

【讨论】:

  • 不幸的是,“仅启用我的代码”已取消选中。但这似乎无关紧要,因为调用者和被调用者实际上都是我的代码。
  • @John,这很奇怪。我的下一步是为所有异常类型打开“抛出时中断”,看看这是否把我甩到了我预期的地方。这不会解决您的问题,但会让我们更进一步。
  • 这很奇怪,在打开 "break on throw" 后,我收到了无法加载的 XmlSerializer 程序集的 FileNotFound 异常。没有“break on throw”,一切正常。
  • @John,这个特殊的例外通常是一个红鲱鱼。如果你点击“继续”,它应该会移动到下一个。
  • 没用,这种方法噪音太大了。
【解决方案2】:

如果一切都失败了,你也可以把这样的东西放到被调用的方法中:

#if DEBUG
    System.Diagnostics.Debugger.Break();
#endif

这基本上会“以编程方式”在那里导致断点。

您还可以通过以下方式使其稍微好一点:

  if(Debugger.IsAttached)
    Debugger.Break();

只有当你实际在调试器中运行它时它才会中断。


编辑:

第二个想法是,如果您有代码可以编辑它,那么您可能只需通过 VisualStudio 在此处放置一个常规断点。我想我的回答没有意义......对不起:)

【讨论】:

  • 您的回答非常有道理,请参阅我对@JaredPar 回答的评论。我遇到了跳过断点并且您的方法有效的问题。
【解决方案3】:

我的解决方法是在Tick() 中创建定时器和调用方法:

GUI 代码 -> 通过 Method.Invoke 调用函数 -> 函数设置一个 Timer -> 在 Tick 中有函数体

不幸的是它不是很漂亮(在某些情况下不适合)

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 2014-02-17
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多