2016-06-06 2 views
-2

Я столкнулся с проблемой, когда кто-то явно отключил константы DEBUG и TRACE на проекте C# .NET, над которым я работал, поэтому мои вызовы Debug.WriteLine не имели никакого эффекта. (На выходе не выводился вывод отладки.) После повторного включения их as described here, я начал видеть свой вывод.Почему Debug.WriteLine не работает без константы DEBUG?

Зная, как исправить это полезно, но мой вопрос: почему? Насколько я понимаю, DEBUG - это константа времени компиляции , а класс Debug уже скомпилирован, когда я строю свой проект. Итак, как мои звонки на Debug.WriteLine пропущены; не следует ли их компилировать, как и весь мой другой код?

Я могу думать о нескольких возможных способов это может произойти:

  • MS реализованы некоторые специальные «особенность» в компиляторе, чтобы удалить эти вызовы без постоянного
  • Visual Studio настраивает отладчик такой, что он делает или не слушается на основе этого параметра проекта для вывода отладки при запуске
  • Debug имеет некоторые сумасшедшие код, который рассматривает сборку вызова для какой-то флаг установлен во время компиляции

MS's documentation указывает, что это ожидаемое поведение, но я не смог найти документацию о том, как это работает. Конечно, это может быть и то, что мне даже не приходило в голову.

Так как это работает?

ответ

1

взглянуть на Conditional attribute ... Это приводит к тому, вызов метода будет проигнорирован в JIT-времени, если указанный символ не определен. Большинство методов System.Diagnostic.Debug определяются с использованием этого атрибута и значения «DEBUG» (см., Например, reference source), поэтому вызовы не возникают, если символ DEBUG не определен в JIT-время.

+0

Обновлено по запросу – nitzmahone

1

Debug.WriteLine(..) звонки удаляются компилятором, если константа DEBUG не установлена ​​во время компиляции кода.

Один из способов имитировать это в коде с помощью #if DEBUG, например:

#if DEBUG 
    // This portion of the code will only exist in code compiled with the DEBUG constant set. 
#end if 

Другой способ заключается в добавлении ConditionalAttribute[Conditional("DEBUG")] в верхней части ваших методов, что и класс Debug делает для WriteLine(..).

Точные детали можно найти по следующей ссылке на MSDN в документации ConditionalAttribute: https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute(v=vs.110).aspx

+0

Я просто хотел сообщить вам, что я ценю ваш ответ. Я немного обсуждал, спрашивать ли вас, обновляете ли вы или Мэтт, чтобы обновить его, но я решил выбрать его, так как он получил право на это и был опубликован немного раньше. Но все же, большое спасибо. =) – jpmc26

Смежные вопросы