当Debug.Assert失败时导致VS2010调试器中断

时间:2011-10-03 09:35:21

标签: c# wpf visual-studio-2010

Debug.Assert的参数评估为false时,是否有任何方法可以在调试时导致Visual Studio 2010中断?

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

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

如果我没有调试,则在断言失败时会弹出一个窗口。

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

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

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

7 个答案:

答案 0 :(得分:6)

如果通过调试意味着使用“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”确实解决了这个问题(对我而言)。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

它似乎至少在控制台应用程序中按预期工作:在调试版本中,会弹出一个对话框,允许您使用调试器进入应用程序,但在发布版本中,没有任何反应。不可否认,我只是使用了一个简单的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();
        }
    }
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

您可以通过搜索Debug.Listeners的代码来查找它,并查看某个地方是否清除或修改了默认代码,或者查看您的trace部分是否有{{1}}部分的app.config。

默认情况下,从我读过的内容来看,你一定得到弹出窗口。

答案 6 :(得分:0)

如果使用DefaultTraceListener,您可以将以下部分添加到app.config文件中,以启用Debug.Assert(false)

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

有关详细信息,请参阅assert elementDefaultTraceListener.AssertUiEnabled Property