Компилятор .NET - DEBUG vs. RELEASE - PullRequest
       11

Компилятор .NET - DEBUG vs. RELEASE

18 голосов
/ 26 августа 2008

В течение многих лет я использовал константу DEBUG в VB.NET для записи сообщений на консоль. Я также использовал System.Diagnostics.Debug.Write таким же образом. Я всегда понимал, что когда RELEASE использовался в качестве опции сборки, все эти операторы были пропущены компилятором, освобождая ваш производственный код от накладных расходов операторов отладки. Недавно, работая с Silverlight 2 Beta 2, я заметил, что Visual Studio на самом деле подключен к сборке RELEASE, которую я запускал с общедоступного веб-сайта, и отображал операторы DEBUG, которые, как я предполагал, даже не были скомпилированы! Теперь я склоняюсь к тому, чтобы предположить, что с моей средой что-то не так, но я также хочу спросить любого, кто обладает глубокими знаниями о System.Diagnostics.Debug и опции сборки DEBUG в целом, что я могу недопонимать здесь.

Ответы [ 7 ]

21 голосов
/ 26 августа 2008

Предпочтительным методом является использование условного атрибута для переноса вызовов отладки, а не использование директив компилятора. #ifs может стать хитрым и может привести к странным проблемам сборки.

Пример использования условного атрибута следующий (в C #, но работает и в VB.NET):

[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

Когда вы компилируете без установленного флага DEBUG, любой вызов WriteDebug будет удален, как предполагалось, что происходило с Debug.Write ().

5 голосов
/ 27 августа 2008

Проверьте метод Debug.Write . Он помечен

[Conditional("DEBUG")]

атрибут.

Справка MSDN для Условный атрибут состояния:

Указывает компиляторам, что метод вызов или атрибут должны игнорироваться если не указано условное Символ компиляции определен .

Неважно, имеет ли конфигурация сборки метку выпуска или отладки, важно, определен ли в ней символ DEBUG.

1 голос
/ 16 марта 2010

Чтобы выбрать, хотите ли вы, чтобы отладочная информация была скомпилирована или удалена,

войдите на вкладку «Сборка» в окне свойств проекта.

Выберите правильную конфигурацию (Active / Release / Debug / All) и убедитесь, что вы проверьте «DEBUG Constant», если вам нужна информация, или снимите флажок, если вы этого не сделаете.

Применить изменения и перестроить

1 голос
/ 26 августа 2008

Я тоже прочитал статью, и это заставило меня поверить, что когда DEBUG не был определен, то ConditionalAttribute, объявленный в функциях System.Debug, заставил бы компилятор полностью исключить этот код. Я предполагаю, что то же самое относится и к TRACE. То есть функции System.Diagnostics.Debug должны иметь атрибуты ConditionalAttributes для DEBUG и TRACE. Я был неправ в этом предположении. Отдельный класс Trace имеет те же функции, и они определяют ConditionalAttribute в зависимости от константы TRACE.

Из System.Diagnostics.Debug: _ Общедоступная общая запись (_ сообщение как строка _ )

Из System.Diagnostics.Trace: _ Общедоступная общая подпрограмма записи (_ сообщение как строка _ )

Тогда кажется, что мое первоначальное предположение было верным, что операторы System.Diagnostics.Debug (или system.Diagnostics.Trace) на самом деле не включены в компиляцию, как если бы они были включены в области #IF DEBUG (или #IF TRACE) ,

Но я также узнал от вас, ребята, и убедился, что сборка RELEASE сама по себе не заботится об этом. По крайней мере, в проектах Silverlight, которые все еще немного нестабильны, вам нужно войти в «Дополнительные параметры компиляции ...» и убедиться, что DEBUG не определен.

Мы перешли с .NET 1.1 / VS2003 на .NET 3.5 / VS2008, поэтому я думаю, что некоторые из них работали по-другому, но, возможно, они изменились в 2.0 / VS2005.

1 голос
/ 26 августа 2008

Использование символа компилятора DEBUG, как вы сказали, фактически пропускает код из сборки.

Я считаю, что System.Diagnostics.Debug.Write всегда будет выводиться на подключенный отладчик, даже если вы встроили режим Release. Согласно статье MSDN :

Записывает информацию об отладке в прослушиватели трассировки в коллекции Listeners.

Если вам не нужен какой-либо вывод , вам нужно заключить вызов в Debug.Write с константой DEBUG, как сказал Хуан:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif
1 голос
/ 26 августа 2008

Я инкапсулирую вызов Debug в свой собственный класс и добавляю директиву прекомпилятора

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}
0 голосов
/ 26 августа 2008

По моему опыту, выбор между Debug и Release в VB.NET не имеет значения. Вы можете добавить пользовательские действия в обе конфигурации, но по умолчанию я думаю, что они одинаковы.

Использование Release определенно не удалит операторы System.Diagnostics.Debug.Write.

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