【问题标题】:Debug.Assert() has stopped working in my projectDebug.Assert() 已停止在我的项目中工作
【发布时间】:2010-12-30 20:27:30
【问题描述】:

由于某种原因,以下行在我的 ASP.NET MVC 项目中没有任何作用:

  System.Diagnostics.Debug.Assert(false);

我已经三重检查了我正在使用调试配置,并且在调试配置设置中检查了“定义调试常量”。

我的单元测试项目中也出现了同样的问题。

实现我自己的断言方法似乎微不足道,但有点尴尬。任何有关如何解决此问题的提示将不胜感激。

编辑:我在我的项目中使用了几个第三方模块。这可能是由于引用了在发布模式下编译的模块造成的吗?

【问题讨论】:

  • 您是否仔细检查过您没有运行发布版本?
  • 用Reflector打开你的dll/exe,看看assert是否真的在代码中?您的程序集实际上是从您认为的位置加载的吗?也许再检查一次您正在使用调试版本。
  • @ChrisF:正如我所说,是的。三倍... :-)
  • 你确定有System.Diagnostics.Debug.Assert(false);的程序集被加载了吗?
  • 这里有一些尝试:使用 Resharper 而不是 VS 使用 Debug 运行测试并确保该行实际被命中。把它扔出去。

标签: c# asp.net-mvc assert


【解决方案1】:

由于您是通过 ASP.NET MVC 运行的,您的 web.config 中是否存在导致问题的 debug=false?

【讨论】:

  • 很遗憾没有。我刚刚检查了我的 web.config 并且调试这个词只在这一行:
  • 同时查看配置文件中是否有“system.diagnostics”部分。您可以在配置文件中关闭断言。
  • @Eric:感谢您的建议,但我的 web.config 中没有提到“诊断”一词。
  • @Adrian Grigore 你检查过你的 .NET 的其他配置了吗?如果您创建一个简单的控制台应用程序,它会被击中吗?
【解决方案2】:

ASP.Net 断言显示在 VS 控制台中,而您的网页通过 VisualStudio 显示。它不会像编程语言那样中断线程来显示 MsgBox 或中断断言行。

【讨论】:

    【解决方案3】:

    古老的问题,但如果您没有定义默认侦听器,它将不会像往常一样显示消息对话框。我还没有确认它是否真的会燃烧并且只是被吃掉(我怀疑是这种情况)或者它是否根本不燃烧。

    但无论哪种方式,它都不会显示对话框。

    来自DefaultTraceListener 的文档

    Assert 和 Fail 方法调用的消息框显示 取决于 DefaultTraceListener 的存在。如果 DefaultTraceListener 不在 Listeners 集合中,消息 框不显示。

    DefaultTraceListener 可以被 元素,按元素,或通过调用清除 Listeners 属性上的方法 (System.Diagnostics.Trace.Listeners.Clear())。

    您可以使用以下代码检查您的侦听器并获取类型:

     var listeners = new TraceListener[Debug.Listeners.Count];
     Debug.Listeners.CopyTo(listeners, 0);
     foreach (var listener in listeners) {
        Debug.WriteLine("Name : {0} of type : {1}", listener.Name, listener.GetType());
     }
    

    如果您没有一个名为“默认”的选项,Debug.Assert 将静默失败。

    就配置而言,假设有一个名为 Default 的侦听器可用,这将起作用:

    <system.diagnostics>
        <trace autoflush="false">
            <listeners>
            </listeners>
        </trace>
    </system.diagnostics>
    

    假设有一个名为 Default 的侦听器可用,这将起作用:

    <system.diagnostics>
        <trace autoflush="false">
            <listeners>
               <add name="bigEarsListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TracingInfo.log"/>
            </listeners>
        </trace>
    </system.diagnostics>
    

    这将在我们明确定义默认值时起作用:

    <system.diagnostics>
        <trace autoflush="false">
            <listeners>
               <remove name="Default" />
               <add name="Default" type="System.Diagnostics.DefaultTraceListener" />
               <add name="bigEarsListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TracingInfo.log"/>
            </listeners>
        </trace>
    </system.diagnostics>
    

    这不会工作:

    <system.diagnostics>
        <trace autoflush="false">
            <listeners>
               <remove name="Default" />
               <add name="bigEarsListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TracingInfo.log"/>
            </listeners>
        </trace>
    </system.diagnostics>
    

    如果您的 web.config 中没有诊断部分,则默认值可能会被某些 VS 扩展等删除或覆盖,因此添加此部分应使其恢复预期行为。

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2016-04-26
      • 2014-10-10
      • 2016-12-14
      相关资源
      最近更新 更多