.NET源代码可以硬编码调试断点吗?

时间:2008-12-11 23:55:01

标签: c# visual-studio .net-2.0 breakpoints

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

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

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

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

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

7 个答案:

答案 0 :(得分:127)

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

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

当然,它仍将在Release版本中编译。如果您希望它的行为更像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();
    }

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

答案 1 :(得分:12)

System.Diagnostics.Debugger.Break

答案 2 :(得分:9)

我曾遇到一种无效的情况

System.Diagnostics.Debugger.Break();

但这确实

System.Diagnostics.Debugger.Launch();

答案 3 :(得分:9)

如果您只想要一行代码而不是4行,请将

包裹起来
listH.add(new Entry(n,mindist));

#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进入方法。

答案 4 :(得分:4)

如果只是将Visual Studio配置为弹出调试器,即使吞下它也可以呢?

这样做:

  • 转到Debug-> Exceptions ...
  • 找到正确的例外,如果是您自己的
  • ,则添加它
  • 检查异常的“Thrown”复选框

这将停止引发异常的位置上的Visual Studio,而不仅仅是它是否被处理。

您可以查看更多信息here

答案 5 :(得分:3)

我发现一个很好的技巧是将Debugger.Break()放在你的例外中。

答案 6 :(得分:1)

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