我正在寻找在.NET的方式(2.0,C尤其#)源代码触发调试休息,就好像一个断点设置在这一点上,而不必记住在调试器中设置有一个特定的断点,没有生产运行的干扰。
我们的代码需要吞下生产异常,所以我们不会破坏链接到我们的客户端应用程序,但我试图设定,让这样的错误会弹出来进行分析,如果它发生在一个调试器中运行,否则将被忽略。
我使用Debug.Assert(false)
尝试一直不太理想,我认为Debug.Fail()
将行为相同的方式。它理论上应该在生产没有任何影响,而且它成功地调试时停下来,而是通过设计有(据我可以告诉)没办法继续执行,如果你想忽略这个错误,就像你可以用一个实际的断点,并像它会在生产做我们吞下错误。这显然也打破了可变状态的评价,因为调试器实际上是在原生系统的代码,而不是在我们停下来,所以它的调试的帮助是有限的。 (也许我失去了获得回事情看变量等在那里发生的一些方法。???)
我希望这样的事情Debug.Break()
,但它似乎不存在(除非也许在.NET的更高版本?),并没有其他Debug
方法似乎适用,无论是。
更新:虽然ctacke的答案是什么,我一直在寻找最好的比赛,因为我已经还发现了一招与Debug.Assert的() - 在调试器中运行时 - 暂停调试器,去为调试代码。 assert调用待定(以绿色突出,因为它是在框架代码下)和命中失调(移位-F11),然后打忽略断言对话框。这将使暂停时断言(并能够继续执行,就好像没有发生,因为它被忽略)返回调试器。可能有其他的方式做同样的事情(不打重试更直接地做到这一点?),但这种方式是直观的。
你可能有这样的事情后:
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();
}
然后在你的代码添加到它的调用。
System.Diagnostics.Debugger.Break
?
如果你想只有一个行代码,而不是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
方法。
我遇到了一个情况,一旦这个地方没有工作
System.Diagnostics.Debugger.Break();
但这并
System.Diagnostics.Debugger.Launch();
如何只配置Visual Studio来弹出与调试器,即使你吞下去?
做这个:
这将停止Visual Studio中的位置是抛出异常,不只是如果它没有被处理。
你可以看到更多信息here。
一个好的技巧,我发现在你的异常的构造函数把Debugger.Break()。
在Visual Studio 2010中,击中一个Debug.Assert
对话框重试带您到失败的调试断言,就像如果你有一个断点。