.NET源代码可以硬编码一个debugging断点?

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

我们的代码需要吞噬生产中的exception,所以我们不会中断连接到我们的客户端应用程序,但是我正在设置它,以便在碰巧在debugging器中运行时会popup这样的错误进行分析,否则将被安全地忽略。

我尝试使用Debug.Assert(false)并不理想,我假定Debug.Fail()行为方式是一样的。 理论上它在生产中没有任何作用,并且在debugging时停止了,但是通过devise,如果你想忽略这个错误,就像你可以用一个实际的断点一样,就像在生产中我们吞下错误一样。 它也显然打破了对variables状态的评估,因为debugging器实际在本地系统代码中停止,而在我们的系统代码中停止,所以它的debugging帮助是有限的。 (也许我错过了一些回到事情的方式来看看variables发生的地方。)

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

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

你可能是在这样的事情之后:

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

当然这仍然会在发布版本中编译。 如果你希望它的行为更像Debug版本,在Release版本中不存在代码,那么你可以这样做:

 [Conditional("DEBUG")] void DebugBreak() { if(System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); } 

然后在你的代码中添加一个调用。

System.Diagnostics.Debugger.Break?

一旦遇到这种情况,我就会遇到一种情况

 System.Diagnostics.Debugger.Break(); 

但是这样做了

 System.Diagnostics.Debugger.Launch(); 

如果configurationVisual Studio即使吞下它也会popupdebugging器呢?

做这个:

  • 转到Debug-> Exceptions …
  • find正确的exception,或者添加它,如果它是你自己的
  • 检查“投掷”checkbox的例外

这将使Visual Studio停止抛出exception的位置,而不仅仅是处理exception。

你可以在这里看到更多的信息。

如果你想只有一行代码而不是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是为了防止debugging器在Stop方法的内部代码上停止,并且使用F11进入方法。

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

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