【问题标题】:DebugBreak() equivalent in C#C# 中的 DebugBreak() 等效项
【发布时间】:2022-03-08 20:33:53
【问题描述】:

在 C# 中是否有任何等效于DebugBreak() 的语句?我想在满足特定条件时调用调试器。

【问题讨论】:

    标签: c# .net debugging


    【解决方案1】:

    您可以在System.Diagnostics 命名空间中使用Debugger 类的Break 方法:

    Debugger.Break();
    

    现在,还有一种不同的方式可以添加条件断点,而无需为向项目添加代码而烦恼。

    这当然只有在已经通过调试器运行程序时才有效

    您可以先在您希望调试器停止的位置添加一个常规断点,然后右键单击该断点的红点:

    然后编辑条件以满足您的需要:

    这将在你的断点点内用一个小的 + 来表示:

    【讨论】:

    • 您不能以这种方式(使用条件子句)在复杂条件上声明断点。
    • Debugger.Break 的好处是即使没有附加调试器也能正常工作。
    • @Artur 复杂性有限,是的,我只是添加它来完成答案。特定问题的正确答案仍然是Debugger.Break();
    • 我认为 Debugger.Launch() 不应该从生产代码中被允许,所以我需要#if 语句,Debbuger.Launch() 也完全破坏了安全性并可能导致意外结果。另一方面,Debug.Assert 在遇到代码时抛出异常(允许在 VS IDE 下中断),编译器在发布版本上完全跳过,所以这是一个不错的选择,还不错。
    • 另外,您应该记住条件断点会显着减慢您的应用程序。调试循环并仅在某些情况下中断可能需要很长时间。
    【解决方案2】:

    关于其他答案,我更喜欢使用Debugger.Launch()

    如果应用程序尚未在调试器中运行,Launch() 将调用调试器对话框,允许您将 Visual Studio(或其他调试器)附加到进程。但是,如果您已经在调试,它将直接通过 Debugger.Launch() 调用。另一方面,Break() 将充当断点 - 每次到达该点时都会中断(如果尚未附加进程,则会调用调试器对话框)。

    要非常小心,不要在代码中留下任何一条语句。将带有Debugger 调用的代码发送到生产环境可能会停止您的应用程序或造成难以追踪的错误(上个月的糟糕体验)。

    【讨论】:

    • Joe,感谢您详细说明 Debug.Launch() 和 Debug.Break() 之间的区别
    【解决方案3】:
    System.Diagnostics.Debugger.Break();
    
    //Lauches the JIT debug window
    System.Diagnostics.Debugger.Launch();
    

    这在调试服务时特别有用,因为您会获得即时调试器窗口,然后可以选择 Visual Studio 窗口来调试服务。

    【讨论】:

    • 如果您只希望它在已附加调试器时触发,可以选中Debugger.IsAttached
    • @Richard - 哪一行代码?调试器不需要为 Debugger.Launch 附加调试器,因为这会显示窗口以提供附加调试器的机会
    • 第一个(显然)。 if (Debugger.IsAttached) { Debugger.Break(); } 是具有永久断点的有用模式(不依赖于调试器保存状态),我通常将其包含在 #if DEBUG 内的最后机会异常处理程序中。
    • @Richard - 谢谢,老实说,我只使用过 debugger.launch,所以我不知道 debugger.attached。谢谢(你的)信息! +1
    【解决方案4】:

    也许Debugger.Break

    System.Diagnostics.Debugger.Break();
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2012-07-31
      • 2010-10-20
      • 2013-12-09
      • 1970-01-01
      • 2014-05-08
      • 2023-03-09
      相关资源
      最近更新 更多