76

我正在寻找一种在.NET(特别是2.0,特别是C#)中为源代码触发调试中断的方法,就像在该点设置了断点一样,而不必记住在调试器中设置特定的断点,并且不干扰生产运行时。

我们的代码需要吞下生产中的异常,因此我们不会破坏链接到我们的客户端应用程序,但我正在尝试对其进行设置,以便如果碰巧在调试器中运行此类错误将弹出以进行分析,否则将被安全地忽略。

我的使用尝试Debug.Assert(false)并不理想,我认为它Debug.Fail()的行为方式相同。从理论上讲,它在生产中应该没有影响,并且在调试时确实会成功停止,但是根据设计(据我所知),如果您想忽略该错误,则无法继续执行,就像使用实际断点一样,就像我们在生产中吞下错误一样。它显然也破坏了对变量状态的评估,因为调试器实际上在本机系统代码中停止,而不是在我们的系统代码中,所以它的调试帮助是有限的。(也许我错过了一些重新审视事物以查看变量等发生的地方的方法。???)

我希望有类似的东西Debug.Break(),但它似乎不存在(除非可能在更高版本的 .NET 中?),而且Debug似乎也没有其他方法适用。

更新:虽然 ctacke 的答案是我所寻找的最佳匹配,但我还发现了 Debug.Assert() 的一个技巧——在调试器中运行时——暂停调试器,转到调试代码。断言调用挂起(以绿色突出显示,因为它在框架代码中已关闭)并点击 Step-Out (shift-F11),然后在断言对话框中点击 Ignore。这将使调试器在断言返回时暂停(并且能够继续执行,就好像它没有发生一样,因为它被忽略了)。可能还有其他方法可以做同样的事情(点击重试会更直接吗?),但这种方式很直观。

4

7 回答 7

137

您可能正在追求这样的事情:

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

当然,这仍然会在发布版本中编译。如果您希望它的行为更像 Debug 对象,其中代码根本不存在于 Release 构建中,那么您可以执行以下操作:

    // Conditional("Debug") means that calls to DebugBreak will only be
    // compiled when Debug is defined. DebugBreak will still be compiled
    // even in release mode, but the #if eliminates the code within it.
    // DebuggerHidden is so that, when the break happens, the call stack
    // is at the caller rather than inside of DebugBreak.
    [DebuggerHidden]
    [Conditional("DEBUG")] 
    void DebugBreak()
    {
        if(System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Break();
    }

然后在您的代码中添加对它的调用。

于 2008-12-12T00:02:20.277 回答
13

我曾经遇到过这种情况不起作用

System.Diagnostics.Debugger.Break();

但这确实

System.Diagnostics.Debugger.Launch();
于 2008-12-11T23:58:57.910 回答
12

System.Diagnostics.Debugger.Break?

于 2008-12-11T23:56:42.050 回答
10

如果您只想有一行代码而不是 4 行,请换行

#if DEBUG
       if (Debugger.IsAttached)
            Debugger.Break();
#endif

进入

public static class DebugHelper
{
    [DebuggerHidden]
    [Conditional("DEBUG")]
    public static void Stop()
    {
       if (Debugger.IsAttached)
            Debugger.Break();
    }
}

并使用

DebugHelper.Stop();

DebuggerHiddenAttribute已添加以防止调试器在Stop方法的内部代码上停止并使用F11.

于 2017-05-27T14:15:57.717 回答
4

即使您吞下它,只需将 Visual Studio 配置为弹出调试器怎么样?

做这个:

  • 转到调试-> 异常...
  • 找到正确的例外,或者如果它是您自己的,则添加它
  • 检查异常的“抛出”复选框

这将在引发异常的位置停止 Visual Studio,而不仅仅是在未处理异常的情况下。

您可以在此处查看更多信息。

于 2008-12-12T00:02:41.820 回答
4

我发现一个不错的技巧是将 Debugger.Break() 放在异常的 ctor 中。

于 2008-12-12T08:12:19.710 回答
1

在 Visual Studio 2010 中,点击对话框上的重试会将Debug.Assert您带到失败的调试断言,就像您有一个断点一样。

于 2011-11-22T20:52:53.847 回答