Сведения о вопросе

FUTER

03:12, 24th August, 2020

Теги

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

Просмотров: 480   Ответов: 7

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



  Сведения об ответе

KOMP

00:03, 28th August, 2020

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

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

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

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


  Сведения об ответе

piter

17:20, 13th August, 2020

Изучите метод Debug.Write . Он помечен знаком

[Conditional("DEBUG")]

атрибут.

MSDN справка для ConditionalAttribute государства:

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

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


  Сведения об ответе

lool

22:41, 29th August, 2020

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

введите вкладку "Build" в окне свойств проекта.

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

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


  Сведения об ответе

COOL

22:38, 1st August, 2020

Что я делаю инкапсуляции вызовов для отладки в моем собственном классе и добавьте директиву прекомпилятором

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}


  Сведения об ответе

baggs

22:10, 6th August, 2020

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

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

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

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

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif


  Сведения об ответе

SEEYOU

22:47, 12th August, 2020

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

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

От System.Diagnostics.Trace: _ Public Shared Sub WriteLine ( _ сообщение в виде строки _ )

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

Но я также узнал здесь от вас, ребята, и проверил, что сборка RELEASE сама по себе не заботится об этом. По крайней мере, с проектами Silverlight, которые все еще немного шелушатся, вам нужно попасть в "Advanced Compile Options..." и убедиться, что DEBUG не определен.

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


  Сведения об ответе

FAriza

23:16, 24th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться