Mono - Debug.Assert не работает - PullRequest
       4

Mono - Debug.Assert не работает

10 голосов
/ 20 сентября 2011

У меня есть эта программа здесь:

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

Как я могу сделать эту работу?Я хотел бы, чтобы он имел такой же эффект, как макрос assert в C, то есть он должен просто привести к краху программы.Возможно ли это сделать с помощью Debug.Assert или есть какая-то другая функция, которая достигает этого?

Спасибо.

Ответы [ 3 ]

11 голосов
/ 20 сентября 2011
  1. Debug.Assert помечается [ConditionalAttribute ("DEBUG")] . Это означает, что все вызовы удаляются компилятором, если не определен символ препроцессора DEBUG. Попробуйте это:

    $ dmcs -d:DEBUG LameProg.cs
    
  2. Mono не отображает диалоговое окно, подобное реализации Microsoft .NET, когда выполняется утверждение. Вам необходимо установить TraceListener , например,

    $ export MONO_TRACE_LISTENER=Console.Error
    $ mono LameProg.exe
    

Debug.Assert Вызовы обычно используются в отладочных сборках и удаляются из сборок выпуска. Если вы хотите убедиться, что определенное условие выполняется, и эта проверка должна присутствовать в сборках выпуска, используйте оператор if и throw исключение:

public static void Main(string[] args)
{
    int a = 2;
    int b = 3;
    if (a != b)
    {
        throw new Exception("Bleh");
    }
    System.Console.WriteLine("Haha it didn't work");
}
3 голосов
/ 01 октября 2015

Есть еще одна хитрость: вы можете добавить поведение «выйти сейчас» через TraceListener, потому что сбои Debug.Assert вызывают вызов Fail () в слушателе трассировки.

Вам все еще нужно -define: DEBUG(и TRACE?).Лично я ожидаю, что вызовы Assert () (в сборках DEBUG) остановят мою программу, сбросят отладочную информацию и завершат работу.Итак, вот как я это делаю:

В своем коде я устанавливаю настраиваемый прослушиватель трассировки для дампа стека и добавляю вызов 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

И все готово.

1 голос
/ 16 января 2013

Полагаю, вам нужны две вещи: атрибут DEBUG для компилятора и прослушиватель трассировки для среды выполнения. Я получил его на работу с

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

Это все равно не завершается немедленно при ошибке подтверждения, как я ожидал, но, по крайней мере, что-то печатает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...