当Debug.Assert失败时导致VS2010调试器中断
当Debug.Assert
的参数Debug.Assert
值为false
时,是否有任何方法可以在调试时导致Visual Studio 2010中断?
示例:在我的代码中,我有这样的行:
Debug.Assert(!double.IsInfinity(x));
如果我没有调试,则在断言失败时会弹出一个窗口。
但是当我调试时,断言会记录到“输出”窗格中,这很容易被遗漏; 没有弹出窗口,调试器不会停止。 因此:当Debug.Assert
失败时,有没有办法强制Visual Studio调试器中断?
(顺便说一句:我正在开发一个基于WPF的桌面应用程序。在Windows窗体应用程序中,行为似乎有所不同:这里,调试器在Debug.Assert
上Debug.Assert
。)
编辑 :请让我澄清:我不是在寻找Debug.Assert()的替代方法,因为我使用的代码和外部代码充满了Debug.Assert()语句。 我正在寻找一种方法来导致Visual Studio调试器在Debugg.Assert
失败时Debugg.Assert
。 (我认为早期的VS版本就是这样做的,并且VS2010中的行为发生了变化)。
如果通过调试意味着使用“Step Into”function,请参阅此MS对问题的回答。
在Assert语句中使用“Step Over”确实解决了这个问题(对我而言)。
您可以将条件断点用于此类行为,只需在要断开的行上设置断点,然后右键单击左侧的点并选择条件,在弹出窗口中输入所需的条件(在您的情况下为double)。 IsInfinity(X))
使用Debugger.Break方法(在System.Diagnostics
命名空间中)。 如果您在调试器中运行,这将中断执行。
它似乎至少在控制台应用程序中按预期工作:在调试版本中,会弹出一个对话框,允许您使用调试器进入应用程序,但在发布版本中,没有任何反应。 不可否认,我只是使用了一个简单的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(); } } }
你不能在!double.IsInfinity(x)
而不是使用断言时抛出exception吗?
您的应用程序似乎从Debug类中删除了默认的TraceListener,并将其替换为以不同方式实现Fail(string)
方法的自定义TraceListener。
您可以通过搜索Debug.Listeners
的代码来Debug.Listeners
,看看是否清除或修改了默认代码,或者查看app.config中是否有trace
部分。
默认情况下,从我读过的内容来看,你一定得到弹出窗口。
如果使用DefaultTraceListener
您可以将以下部分添加到app.config
文件中,该文件可以打开Debug.Assert(false)
:
有关详细信息,请参阅assert
元素和DefaultTraceListener.AssertUiEnabled属性 。