【问题标题】:Causing VS2010 debugger to break when Debug.Assert fails当 Debug.Assert 失败时导致 VS2010 调试器中断
【发布时间】:2011-10-03 09:35:20
【问题描述】:

Debug.Assert 的参数计算为false 时,有什么方法可以导致Visual Studio 2010 在调试时中断?

示例:在我的代码中,我有这样的行:

Debug.Assert(!double.IsInfinity(x));

如果我不调试,断言失败时会弹出一个窗口。

但是当我调试时,断言被记录到“输出”窗格中,这很容易错过;没有弹出窗口,调试器也不会停止。因此:有没有办法在Debug.Assert失败时强制Visual Studio调试器中断?

(顺便说一句:我正在开发一个基于 WPF 的桌面应用程序。在 Windows 窗体应用程序中,行为似乎有所不同:这里,调试器在 Debug.Assert 处停止。)

编辑:请让我澄清一下:我不是在寻找 Debug.Assert() 的替代方法,因为我使用的代码和外部代码都充满了 Debug .Assert() 语句。我正在寻找一种在 Debugg.Assert 失败时导致 Visual Studio 调试器中断的方法。 (我认为早期的 VS 版本就是这样做的,并且行为在 VS2010 中发生了变化)。

【问题讨论】:

    标签: c# wpf visual-studio-2010


    【解决方案1】:

    如果调试是指使用“Step Into”功能,请参阅此 MS 对问题的回答。

    http://connect.microsoft.com/VisualStudio/feedback/details/522995/system-diagnostics-debug-assert-doesnt-pop-up-messagebox-correctly-when-step-into-it-in-vs-2010-and-2008

    在 Assert 语句中使用“Step Over”也确实解决了问题(对我而言)。

    【讨论】:

    • 不,我指的是使用调试器启动程序并让它执行(直到发生不好的事情)的情况。
    • 嗯,这个场景对我有用,使用 VS 10.0.30319.1 RTMRel 和 .NET 4
    • 你提到的 Connect 文章让我走上了正轨。我遇到的问题在这里描述:connect.microsoft.com/VisualStudio/feedback/details/687333/…。这是一个VS2010的错误;作为一种解决方法,建议打开“只是我的代码”选项。
    • @fmunkert 这似乎在 VS2012 中再次被破坏:“只是我的代码”已打开,但调试器不会在 DEBUG ASSERTION FAILED 时中断
    • 链接已损坏。
    【解决方案2】:

    您可以对这种行为使用条件断点,只需在要中断的行上设置一个断点,然后右键单击左侧的点并选择条件,在弹出窗口中输入所需的条件(在您的情况下是双倍的。IsInfinity(x))

    【讨论】:

    • 请看我上面的说明。
    • +1 一个有趣的事实,虽然我的 Debug.Assert 调用也不起作用,我宁愿修复它,然后在整个项目中加载大量条件断点。
    【解决方案3】:

    使用Debugger.Break 方法(在System.Diagnostics 命名空间中)。如果您在调试器中运行,这将中断执行。

    【讨论】:

    • 请看我上面的说明。
    • ...如果应用程序在没有附加调试器的情况下运行,它会崩溃!
    【解决方案4】:

    至少在控制台应用程序中它似乎按预期工作:在调试版本中,会弹出一个对话框,允许您使用调试器进入应用程序,但在发布版本中,没有任何反应。诚然,我只是使用了一个简单的Debug.Assert(false);,但我不明白为什么这会有很大的不同。我正在运行 Visual Studio 2010 SP1 Ultimate。

    我建议您仔细查看您的构建设置。

    这是我使用的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    
    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                System.Diagnostics.Debug.Assert(false);
    
                Console.ReadLine();
            }
        }
    }
    

    【讨论】:

    • 我写了一个小的 WPF 项目,它只包含一个按钮,它执行Debug.Assert(false) 行。如果我用调试器启动这个程序,调试器将不会停止并且不会显示弹出对话框。我正在使用带有 SP1 的 VS2010 Premium;您使用的是其他版本吗?
    • 这很奇怪。我正在使用 VS2010 Ultimate + SP1,并在控制台应用程序中进行了测试。 (答案已更新以表明这一点。)也许值得一试,尽可能多地缩小层数?
    【解决方案5】:

    你不能在!double.IsInfinity(x) 时抛出异常而不是使用断言吗?

    【讨论】:

    • 我认为异常不是程序开发过程中检查逻辑错误的正确方法。
    • fmunkert - 我认为您指定的条件表示 x 的异常值。如果不是,那么它可能不是要走的路。在那里设置一个条件断点怎么样?只有当值为 false 时才会中断。另外,将条件设置为double.IsInfinity(x)
    【解决方案6】:

    您的应用似乎从 Debug 类中删除了默认 TraceListener,并将其替换为以不同方式实现 Fail(string) 方法的自定义 TraceListener。

    您可以通过在您的代码中搜索Debug.Listeners 来追踪它,并查看默认代码是否被清除或修改,或者查看您的app.config 中是否有trace 部分。

    默认情况下,根据我的阅读,您肯定会看到弹出窗口。

    【讨论】:

      【解决方案7】:

      如果使用DefaultTraceListener,您可以将以下部分添加到您的app.config 文件中,以便在Debug.Assert(false) 上中断:

      <configuration>
         <system.diagnostics>
            <assert assertuienabled="false"/>
         </system.diagnostics>
      </configuration>
      

      详情见assert elementDefaultTraceListener.AssertUiEnabled Property

      【讨论】:

        猜你喜欢
        • 2020-03-21
        • 2015-06-27
        • 2018-09-05
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        相关资源
        最近更新 更多