.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断言,就像您有一个断点一样。