C# Mono-Debug.Assert不起作用

C# Mono-Debug.Assert不起作用,c#,mono,C#,Mono,我这里有一个程序: namespace TodoPlus { using System.Diagnostics; public class LameProg { public LameProg() {} public static void Main(string[] args) { int a = 2; int b = 3; Debug.Assert(a == b, "Bleh")

我这里有一个程序:

namespace TodoPlus {
using System.Diagnostics;

    public class LameProg {
        public LameProg() {}
        public static void Main(string[] args) {
            int a = 2;
            int b = 3;
            Debug.Assert(a == b, "Bleh");
            System.Console.WriteLine("Haha it didn't work");
        }
    }
}
不知何故,Debug.Assert不起作用

我使用的是Mono 2.10.5,这是我用来编译和执行的:

$dmcs LameProg.cs

$mono./LameProg.exe

我怎样才能做到这一点?我希望它与C中的assert宏具有相同的效果,也就是说它应该彻底崩溃程序。是否可以通过Debug.Assert实现这一点,或者是否有其他函数可以实现这一点

谢谢

  • 注释为。这意味着编译器将删除所有调用,除非定义了调试预处理器符号。试试这个:

    $dmcs-d:DEBUG LameProg.cs
    
  • 当点击断言时,Mono不会像Microsoft的.NET实现那样显示对话框。你需要设置一个,例如

    $export MONO\u TRACE\u LISTENER=Console.Error
    $mono LameProg.exe
    

  • 调用通常在调试版本中使用,并从发布版本中删除。如果要确保某个条件成立,并且此检查应该出现在发布版本中,请使用
    If
    语句和
    throw
    异常:

    publicstaticvoidmain(字符串[]args)
    {
    INTA=2;
    int b=3;
    如果(a!=b)
    {
    抛出新异常(“Bleh”);
    }
    System.Console.WriteLine(“哈哈,它不工作”);
    }
    
    我认为您需要两件事:编译器的DEBUG属性和运行时的“跟踪侦听器”。我要和它一起工作

    % export MONO_TRACE_LISTENER=Console.Error
    % mcs -define:DEBUG -debug Prog.cs
    % mono Prog.exe
    

    正如我预期的那样,断言失败时仍然不会立即退出,但至少它会打印一些东西。

    还有另一个技巧:您可以通过TraceListener添加“立即退出”行为,因为Debug.Assert失败会触发对跟踪侦听器中Fail()的调用

    您仍然需要定义:调试(和跟踪?)。我个人希望Assert()调用(在调试构建中)停止我的程序,转储调试信息并退出。我就是这样做的:

    在我的代码中,我安装了一个自定义跟踪侦听器来转储堆栈,并添加了对Exit()的调用。还有维奥拉!您对Assert.Fail()有一个行业标准响应。例如,您还可以在此处打印时间戳等

    public class DumpStackTraceListener : TraceListener
    {
      public override void Write( string message )
      {
         Console.Write( message );
      }
    
      public override void WriteLine(string message)
      {
         Console.WriteLine( message );
      }
    
      public override void Fail(string message)
      {
         Fail( message, String.Empty );
      }
    
      public override void Fail(string message1, string message2)
      {
         if (null == message2)
            message2 = String.Empty;
    
         Console.WriteLine( "{0}: {1}", message1, message2 );
         Console.WriteLine( "Stack Trace:" );
    
         StackTrace trace = new StackTrace( true );
         foreach (StackFrame frame in trace.GetFrames())
         {
            MethodBase frameClass = frame.GetMethod();
            Console.WriteLine( "  {2}.{3} {0}:{1}", 
                               frame.GetFileName(),
                               frame.GetFileLineNumber(),
                               frameClass.DeclaringType,
                               frameClass.Name );
         }
    
    #if DEBUG
         Console.WriteLine( "Exiting because Fail" );
         Environment.Exit( 1 );
    #endif
      }
    }
    
    结合呼叫:

    #if DEBUG
       Debug.Listeners.Add( new DumpStackTraceListener() );
    #endif
    

    另外一个不一定更好的选项是Trace.Assert(…)嘿,很抱歉回复得太晚,但我尝试了dmcs-d:DEBUG-LameProg.cs mono./LameProg.exe,但它不起作用。Trace.Asserte的情况也一样,这里甚至可以找到更好的答案,最初取自这里,并且
    export MONO\u Trace\u LISTENER=Console.Out
    可以用于在stdout而不是stderr上转储断言。对我来说,执行不会在断言时停止。为什么heck没有打印调试。断言stderr/stdout不是mono的默认值?天哪,这看起来像一个恶作剧-断言最后在mono中所做的唯一事情就是打印。很可怕,断言应该以致命的方式关闭程序,但不只是打印stacktrace。我不太喜欢IDE,但谢谢你的建议。理想情况下,应该有一种不使用IDE就能实现这些功能的方法。这是开源的最大优势,您可以按自己喜欢的方式进行更改。但必须先进行rtfm。可能的重复不确定您被否决的原因。这是我迄今为止看到的最有用的答案。没什么大不了的。人们有权发表自己的意见,即使他们的意见是我错了!:)