Debugger.Break有副作用吗?

时间:2018-09-27 14:11:15

标签: c# .net debugging f#

System.Diagnostics.Debugger.Break(); // this DB call has not been mocked

我想将这些代码放置在I / O调用站点的代码中,以使单元测试开发人员知道何时他们没有正确模拟调用,但是我不想造成新的问题。

  1. 在编译为Release时调用Debugger.Break()有什么影响吗?

  2. 在执行调试版本而不进行调试时是否有影响?

2 个答案:

答案 0 :(得分:4)

不幸的是,确实如此。

要解决您的问题:

  1. Debugger.Break将适用于任何构建配置。调试,发布或其他任何方式。

蒂姆·施密特有一个很好的建议。如果要将Debugger.Break限制为仅调试版本,则可以使用Conditional Compilation

#if DEBUG
    Debugger.Break();
#endif
  1. Debugger.Break将具有副作用,即使未附加调试器也是如此。

如果没有附加调试器,则它将尝试附加调试器,或根据要定位的.Net Framework版本将消息发送到Windows错误报告(WER)子系统。

  

如果未附加调试器,则会询问用户是否要附加调试器。

     

...

     

从.NET Framework 4开始,运行时不再严格控制为Break方法启动调试器的过程,而是向Windows错误报告(WER)子系统报告错误。

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.debugger.break?view=netframework-4.7.2#remarks

答案 1 :(得分:3)

正如评论和@AndyJ的答案所解释的,如果没有调试器附加到进程中,则程序将崩溃。

您可能想要的是在运行时调用optimizer=rmsprop之前检查调试器是否已连接。为此,有一个API属性,System.Diagnostics.Debugger.IsAttached