我正在寻找一种在.NET (2.0,特别是C# )中让源代码触发调试中断的方法,就像在那个点上设置了断点一样,而不必记住在调试器中设置特定的断点,并且不会干扰生产运行时。
我们的代码需要在生产环境中接受异常,这样我们才不会中断链接到我们的客户端应用程序,但我正在尝试设置它,以便当它碰巧在调试器中运行时,将弹出此类错误进行分析,否则将安全地忽略这些错误。
我使用Debug.Assert(false)
的尝试并不理想,我假设Debug.Fail()
也会以同样的方式工作。从理论上讲,它在生产中应该没有任何影响,而且在调试时它确实成功地停止了,但是根据设计,如果你想忽略这个错误(就我所知),就没有办法继续执行,就像你可以用实际的断点,并且像在生产中我们吞下错误一样。它显然也破坏了变量状态的计算,因为调试器实际上在本机系统代码中停止了,而不是在我们的代码中,所以它的调试帮助是有限的。(也许我错过了一些返回事物的方法来查看变量,等等它发生的地方。?)
我希望有像Debug.Break()
这样的东西,但它似乎并不存在(除非可能在更高版本的.NET中存在?),而且似乎也没有其他Debug
方法可用。
更新:虽然ctacke的答案是我所寻找的最匹配的,但从那时起,我还发现了Debug.Assert ()的一个技巧--当在调试器中运行时--暂停调试器,转到Debug.Assert调用挂起的代码(突出显示为绿色,因为它在框架代码中已关闭)并点击逐步退出(shift-F11),然后在assert对话框中点击Ignore。这将使调试器在断言返回时暂停(并且能够继续执行,就好像它没有发生一样,因为它被忽略了)。可能还有其他方法可以做同样的事情(点击重试可以更直接地做到这一点吗?),但这种方法很直观。
发布于 2008-12-12 00:02:20
你可能想要这样的东西:
if(System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
当然,这仍然会在发布版本中编译。如果您希望它的行为更像Debug对象,其中代码根本不存在于发布版本中,那么您可以这样做:
// 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-11 23:58:58
有一次我遇到了这样的情况
System.Diagnostics.Debugger.Break();
但这确实做到了
System.Diagnostics.Debugger.Launch();
发布于 2008-12-11 23:56:42
System.Diagnostics.Debugger.Break
https://stackoverflow.com/questions/361468
复制相似问题