Debugger.Break 有副作用吗?

Ove*_*urg 5 .net c# debugging f#

System.Diagnostics.Debugger.Break(); // this DB call has not been mocked
Run Code Online (Sandbox Code Playgroud)

我想将它们放在 I/O 调用站点的代码中,以便让单元测试开发人员知道他们何时没有正确模拟调用,但我不想产生新问题。

  1. 编译为 Release 时,调用 Debugger.Break() 是否有任何影响?

  2. 执行调试构建但不调试时有什么影响吗?

小智 5

不幸的是,对于您的用例来说,确实如此。

为了解决您的疑虑:

  1. Debugger.Break 适用于任何构建配置。调试、发布或其他任何事情。

蒂姆·施梅尔特提出了一个很好的建议。如果您想将 Debugger.Break 限制为仅调试版本,那么您可以使用Conditional Compilation

#if DEBUG
    Debugger.Break();
#endif
Run Code Online (Sandbox Code Playgroud)
  1. 即使未附加调试器,Debugger.Break 也会产生副作用。

如果没有附加调试器,那么它将尝试附加调试器,或者根据您所针对的 .Net Framework 版本向 Windows 错误报告 (WER) 子系统发送消息。

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

...

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

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