当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中的行为发生了变化)。
答案 0 :(得分:6)
如果通过调试意味着使用“Step Into”功能,请参阅此MS对问题的回答。
在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
element和DefaultTraceListener.AssertUiEnabled Property。