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

问题描述 投票:68回答:7

我正在寻找在.NET的方式(2.0,C尤其#)源代码触发调试休息,就好像一个断点设置在这一点上,而不必记住在调试器中设置有一个特定的断点,没有生产运行的干扰。

我们的代码需要吞下生产异常,所以我们不会破坏链接到我们的客户端应用程序,但我试图设定,让这样的错误会弹出来进行分析,如果它发生在一个调试器中运行,否则将被忽略。

我使用Debug.Assert(false)尝试一直不太理想,我认为Debug.Fail()将行为相同的方式。它理论上应该在生产没有任何影响,而且它成功地调试时停下来,而是通过设计有(据我可以告诉)没办法继续执行,如果你想忽略这个错误,就像你可以用一个实际的断点,并像它会在生产做我们吞下错误。这显然也打破了可变状态的评价,因为调试器实际上是在原生系统的代码,而不是在我们停下来,所以它的调试的帮助是有限的。 (也许我失去了获得回事情看变量等在那里发生的一些方法。???)

我希望这样的事情Debug.Break(),但它似乎不存在(除非也许在.NET的更高版本?),并没有其他Debug方法似乎适用,无论是。

更新:虽然ctacke的答案是什么,我一直在寻找最好的比赛,因为我已经还发现了一招与Debug.Assert的() - 在调试器中运行时 - 暂停调试器,去为调试代码。 assert调用待定(以绿色突出,因为它是在框架代码下)和命中失调(移位-F11),然后打忽略断言对话框。这将使暂停时断言(并能够继续执行,就好像没有发生,因为它被忽略)返回调试器。可能有其他的方式做同样的事情(不打重试更直接地做到这一点?),但这种方式是直观的。

c# visual-studio .net-2.0 breakpoints
7个回答
127
投票

你可能有这样的事情后:

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

当然,这仍然会得到编译发布版本。如果你想让它更象调试对象,其中的代码只是一个发布版本不存在,那么你可以做这样的事情:

    // 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();
    }

然后在你的代码添加到它的调用。


12
投票

System.Diagnostics.Debugger.Break


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方法。


9
投票

我遇到了一个情况,一旦这个地方没有工作

System.Diagnostics.Debugger.Break();

但这并

System.Diagnostics.Debugger.Launch();

4
投票

如何只配置Visual Studio来弹出与调试器,即使你吞下去?

做这个:

  • 进入调试 - >例外...
  • 找到合适的异常,或增加它,如果它是你自己
  • 检查“时抛出”复选框例外

这将停止Visual Studio中的位置是抛出异常,不只是如果它没有被处理。

你可以看到更多信息here


4
投票

一个好的技巧,我发现在你的异常的构造函数把Debugger.Break()。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.