Раздельные сборки для отладки и выпуска?

Я считаю, что лучше выпустить ту версию ПО, которую на самом деле тестировали ваши разработчики; Поэтому я стараюсь удалить цель «отладка» из файла проекта / makefile, чтобы можно было собрать (и протестировать, и отладить, и выпустить) только одну версию.

По той же причине я не использую «утверждения» (см. Также Всегда ли утверждения плохи? ...).

Один человек утверждал, что причина для «отладочной» версии заключается в том, что ее легче отлаживать: но я возражал, что вы, возможно, в конечном итоге захотите поддерживать и отлаживать все, что вы выпустили, и поэтому вам нужно создать выпуск, который при необходимости вы можете отлаживать ... это может означать включение символов отладки и отключение некоторых оптимизаций даже в сборке "release".

Кто-то другой сказал, что «это такая плохая идея»; это политика, которую я разработал несколько лет назад, когда я был сожжен:

  • Некоторые разработчики тестируют свои отладочные, но не выпускают версии
  • Некоторые разработчики пишут ошибки, которые проявляются только в окончательной версии.
  • Компания выпускает релизную версию после неадекватного тестирования (является ли Когда-либо полностью адекватным?)
  • Вызов для отладки версии выпуска

С тех пор я видел, как более одного магазина разработки следовали этой практике (т.е. не имели отдельных сборок для отладки и выпуска).

Какая у вас политика?

Судя по всему, консенсус предполагает, что это не такая уж и плохая идея;)

SmacL 07.01.2009 17:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
46
1
11 199
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

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

Хотя, по крайней мере, в одном случае мы выпустили что-то, что еще содержало отладочный код. Единственным последствием было то, что он работал немного медленнее, а файлы журналов были чертовски большими.

@ Пол Томблин: Я бы не согласился. Всегда тестируйте только сборки Release. Я видел код побочного эффекта, присутствующий только в режиме отладки. Тестирование «полного цикла QA» дважды чревато опасностью ...

Mitch Wheat 07.01.2009 16:53

@Paul, мы преодолели это, изменив #ifdef DEBUG на if (_debugging ()), чтобы накладные расходы были только в размере исполняемого файла, и мы могли по-прежнему вызывать код отладки / диагностики в выпуске по мере необходимости. (Только C или C++)

SmacL 07.01.2009 17:08

Re. «файлы журнала были чертовски большими», возможно, потому, что в вашей отладочной сборке есть дополнительные операторы журнала; вместо этого мне нравится контролировать уровень ведения журнала (сколько подробностей регистрируется) с помощью параметров конфигурации во время выполнения.

ChrisW 07.01.2009 17:17

Наша политика заключается в том, чтобы разработчики работали над сборками отладки, но ВСЕ остальные (QA, BAs, продажи и т. д.) Запускают версию выпуска. Вчера мне пришлось исправить ошибку, которая обнаружилась только в сборке релиза, было очевидно, что происходит, просто ПОТОМУ ЧТО она появилась только в выпуске.

Он первый в этом магазине, и я здесь около 18 месяцев.

Все становится непросто, когда сборка Release делает разные вещи по сравнению с сборкой отладки - Да, я был в аду и видел это в очень старом, очень сомнительном производственном коде.

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

Я думаю, это зависит от размера проекта и от того, какой тип системы сборки и тестирования вы используете.

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

здесь мы разрабатываем в режиме отладки и проводим все модульное тестирование в режиме выпуска. мы - небольшой магазин с несколькими (до 12) приложениями для поддержки, начиная от Classic ASP, ASP.Net, VB.Net и C#. У нас также есть специальный человек, который занимается всем тестированием, отлаженные проблемы возвращаются разработчикам.

Наличие отдельных сборок отладки и выпуска - хорошая идея, потому что это действительно упрощает разработку.

Но отладочные сборки должны быть предназначены только для разработки, а не для тестирования. Вы тестируете только релизные сборки. И вы не используете разработчиков для тестирования этих сборок, вы используете тестировщиков.

Это простая политика, которая дает лучшее из обоих миров, ИМО.

Редактировать: В ответ на комментарий, я думаю, очевидно, что отладочные и выпускающие сборки (могут) генерировать разный код. Подумайте: «-DDEBUG» против «-DNDEBUG», «#if defined (DEBUG)» и т. д.

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

Однако отладочные символы не представляют большой проблемы. Всегда выполняйте сборку с отладочными символами, сохраняйте копию нераспределенного двоичного файла, но выпускайте удаленный двоичный файл. Если вы каким-то образом помечаете каждый двоичный файл номером сборки, вы всегда должны иметь возможность определить, какой незарезанный двоичный файл соответствует удаленному двоичному файлу, который вам нужно отлаживать ...

Как удалять двоичные файлы и загружать символы в отладчик из внешнего источника зависит от платформы.

Это все прекрасно, при условии, что у вас есть персонал, поддерживающий такого рода тестирование. Но что, если (как и я) вы работаете в компании, у которой нет ни персонала, ни желания набирать персонал для тестирования таким образом?

Mike Hofer 07.01.2009 16:53

Вы всегда должны стараться, чтобы финальное тестирование проводил кто-то другой, а не разработчик, даже если это всего лишь другой разработчик. Новый человек подойдет к этому под другим углом.

Patrick 07.01.2009 17:05

@Mike: Есть хорошие статистические доказательства того, что разработчики не находят собственных ошибок. Это нормально для персональных шоу, когда у клиента есть прямой контакт с разработчиком, а срочные исправления могут появиться в течение часа между звонком телефона и доставкой DLL. Даже для персонального шоу я бы разделил разработку и тестирование. Должен быть хотя бы минимальный ручной протокол для вещей, которые нужно протестировать на окончательной сборке, прежде чем она выйдет за дверь.

peterchen 16.09.2009 18:07

Я решаю эту проблему, создавая на моем сервере сборки CI только конфигурацию Release. После этого разработчики могут свободно использовать любую конфигурацию, которая им нравится, но как только они передают код в систему управления версиями, с этого момента все становится Release.

Tim Long 25.09.2010 04:18

В моей компании есть и отладка, и выпуск. - Разработчики используют отладочную версию для правильного поиска и исправления ошибок. - Мы используем TDD, поэтому у нас есть большой набор тестов, который мы запускаем на нашем сервере, который тестирует как отладочную, так и выпускную конфигурации сборки, а также 64/32 сборки, которые у нас есть.

Поэтому, если использование «отладочной» конфигурации помогает разработчику быстрее найти ошибку, нет причин не использовать ее - когда код попадает на сервер (для дальнейшего тестирования) или проверяется, мы используем «Release».

Мы всегда строим и то, и другое, даже не задумываясь о том, чтобы не делать этого. Включение параметров отладки увеличивает размер вашего кода и снижает производительность, возможно, это не проблема вашего типа программного обеспечения при тестировании, но что, если клиент запускает ваш код плюс 5 других приложений ...

Проблемы с тестированием можно решить с помощью автоматического тестирования, так что вы можете легко протестировать сборку релиза, когда будете уверены, что готовы к выпуску. Неспособность ваших разработчиков или компании должным образом протестировать релизные сборки - это не ошибка в идее выпуска и отладки сборок, а в ваших разработчиках и / или компании.

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

Это компромисс. Учитывая, что циклы ЦП дешевы и дешевеют, в то время как человеческие циклы остаются дорогими, имеет большой смысл поддерживать только одну версию большой сложной программы - отладочную (двускатную) версию.

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

Я давно научился создавать релизную версию с файлами .PDB, чтобы я мог отлаживать релизную версию. Многие программисты обычно забывают, что, когда вы запускаете отладочную версию с отключенными всеми оптимизациями, вы отлаживаете совсем другую программу. Она может вести себя как релизная сборка (по большей части), но это все же другая программа, чем релизная сборка.

К тому же отладка релизной сборки не так уж и сложна. И если вы получите аварийный дамп, вы все равно должны это сделать.

Согласно моему ответу в связанной теме, мы также используем ту же сборку для отладки и выпуска по очень похожим причинам. Прирост производительности от 10% до 20% от оптимизатора, как правило, очень незначителен по сравнению с оптимизацией вручную на уровне алгоритма. Одна сборка устраняет множество потенциальных ошибок. Конкретно;

  • Неинициализированные переменные и небольшие переполнения буфера могут привести к очень разным результатам в отладочных и оптимизированных сборках выпуска.

  • Даже при наличии символьной информации отладка оптимизированной версии может быть сложной, поскольку объект не соответствует источнику, например переменные могли быть оптимизированы, а код - перестроен. Таким образом, обнаружение ошибок, о которых сообщается в тестируемых сборках, может быть труднее и, следовательно, требует времени.

Сравнив неоптимизированные и оптимизированные сборки при автоматических регрессионных тестах, прирост производительности, обеспечиваемый оптимизацией, не дает достаточной дополнительной ценности для двух сборок в моем случае. Возможно, стоит отметить, что программное обеспечение, которое я разрабатываю, очень требовательно к процессору (например, создание и управление большими моделями поверхности).

Вы также используете анализатор кода для обнаружения «неинициализированных переменных и небольших переполнений буфера»? Также вы можете включить оптимизацию компилятора только наиболее важных модулей (для каждого модуля), сохраняя при этом политику наличия только одной цели сборки.

ChrisW 07.01.2009 17:15

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

Tom 07.01.2009 17:24

@Chris, я использую PC-lint для статического анализа кода и Boundschecker и AQTime для динамического анализа. Я также использую много сторонних библиотек, над которыми у меня гораздо меньше контроля (или желания отлаживать).

SmacL 07.01.2009 17:44

@Tom, Valgrind - отличный инструмент, но, к сожалению, я использую Windows. Я использую инструменты как статического, так и динамического анализа, но у них есть свои ограничения. например попробуйте бросить пару сотен тысяч строк чужого кода, чтобы разложить и расшифровать мегабайты возвращаемых сообщений об ошибках.

SmacL 07.01.2009 17:47

smacl - я знаю, что вы имеете в виду - попробуйте включить -Wall -Wextra -Werror -ansi -pedantic -std = C++ 98 в любой устаревшей кодовой базе и посмотрите, сколько единиц компиляции вы можете сломать. ИМО, предупреждения компилятора нужно контролировать железным кулаком в любом магазине программного обеспечения, чтобы все было достаточно чистым для анализа.

Tom 09.01.2009 08:55
Ответ принят как подходящий

Это может быть незначительно, но это дополняет то, что здесь сказали другие. Одним из преимуществ тестовых сборок QA является то, что со временем встроенные возможности отладки и ведения журнала вашего программного обеспечения будут расширяться из-за потребностей разработчиков, которым необходимо выяснить, почему что-то идет не так с QA.

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

Кроме того, я не знаю ни одной компании-разработчика программного обеспечения, у которой есть достаточно длительные циклы, чтобы позволить себе накладные расходы на переключение QA с отладки на сборку выпуска в середине периода тестирования версии. Необходимость выполнять полный цикл контроля качества - это то, что слишком часто случается, очень редко.

"... слишком часто бывает, довольно редко" - ммммм ...: D

demoncodemonkey 14.02.2009 01:03

Я всегда подписывался на подход «Отправляйте то, что вы отлаживаете, чтобы вы могли отлаживать то, что отправляете», по всем причинам, которые вы указываете в своем вопросе.

При разработке на Java я ненавижу неотладочные версии. Когда генерируется исключение, вы не получаете информации о строке, что затрудняет или даже делает невозможным отслеживание ошибок. Кроме того, разница во времени выполнения между отладкой и неотладкой составляет около 5% с Java 5 или новее, так что это действительно не проблема, а с сегодняшними жесткими дисками размер больше не имеет значения.

Положительный момент при использовании отладочных версий:

  • Трассировки стека содержат всю необходимую информацию
  • Переменные можно исследовать
  • Если у вас есть проблема в производстве, вы можете просто подключиться к запущенному процессу, не останавливая сначала сервер для установки отладочной версии.
  • Вас не поймают на хитрые ошибки оптимизации
  • Сборка более простая (всего один артефакт)

Насколько мне известно, включение отладочной информации в байт-код Java (javac -g) вообще не имеет измеримой разницы во времени выполнения, это просто увеличивает размер JAR-файлов. См. Есть ли разница в производительности между включенной и выключенной отладкой Javac?.

sleske 13.11.2015 13:53

Когда я измерял производительность с Oracle Java 6, мы потеряли около 5%. Едва заметна.

Aaron Digulla 16.11.2015 18:40

so you need to build a release which you can if necessary debug ... this may mean enabling debug symbols, and disabling some optimizations, even in the 'release' build.

Эммм ... похоже, вы делаете для меня отладочную сборку ... верно?

Часть, в которой вы ошиблись, - это следующее утверждение:

I think it's better to release the version of the software which your developers actually tested

Разработчики не тестируют код. Проверяет тестовый код.

Модульные тесты должны тестировать конфигурации сборки ВСЕ. Не заставляйте своих разработчиков работать с одной рукой, связанной за спиной - позвольте им использовать все инструменты отладки, которые у них есть. Сборка отладки - одна из них.

Что касается утверждений: использование утверждений во многом зависит от того, программируете ли вы по контракту. Если да, то утверждения просто проверяют контракт в отладочной сборке.

"... верно?" Называйте это как хотите: это сборка выпуска, которая включает отладочную информацию ... единственная сборка ... гибрид.

ChrisW 07.01.2009 17:50

«Разработчики не тестируют код. Тестируют тестовый код». Некоторые тесты нелегко автоматизировать или они не были автоматизированы.

ChrisW 07.01.2009 17:56

Я согласен с тем, что некоторые тесты нелегко автоматизировать, но будет ли это проблемой для вас, зависит от размера вашей команды QA. Если ваша «команда» QA - это Фрэнк, то разработчикам также необходимо провести QA. Если у вас есть команда QA из двадцати человек, то Они должен запускать ручные тесты.

Graeme Perrow 07.01.2009 18:00

@ChrisW: Я никогда не говорил об автоматических тестах! У вас должны быть записаны сценарии тестирования для кода, который требует ручного тестирования - это все еще тесты. Не полагайтесь на специальное тестирование во время разработки; вы тестируете промежуточные версии системы, и результаты тестирования бессмысленны.

Daniel Paull 08.01.2009 02:52

Разработчики работают с отладочными сборками, QA и все остальные используют версию выпуска, которую мы называем «производственной». Основное преимущество этого заключается в том, что в отладочную сборку мы можем добавить много дополнительного кода и утверждений. Некоторые объекты содержат дополнительную информацию, которая не используется, кроме как при просмотре кода в отладчике. Некоторые объекты периодически проверяют себя, чтобы убедиться, что вся информация о состоянии согласована. Эти вещи делают отладочную версию намного медленнее, но они помогли нам найти бесконечное количество ошибок, которые было бы чертовски трудно найти в производственной сборке.

Как я уже сказал, все наши QA и тестирование производительности используют производственные сборки, и мы иногда сталкиваемся с проблемами, которые проявляются в производстве, но не при отладке. Но они относительно редки, и для разработчика преимущества отладки отладочной сборки, а не производственной сборки, намного перевешивают эту проблему.

Я думаю, что компромисс прост: да, имея только релизную сборку, вы действительно проверяете, что на самом деле поставляется. С другой стороны, вы платите цену за простоту отладки для ваших разработчиков и / или производительность для пользователя, поэтому вам решать, как проверить оба случая.

В большинстве проектов среднего и крупного размера простота отладки будут в конечном итоге гарантирует лучший продукт для ваших пользователей.

Смотрите это Какое ваше самое противоречивое мнение о программировании?

Цитировать:

Opinion: Never ever have different code between "debug" and "release" builds

The main reason being that release code almost never gets tested. Better to have the same code running in test as it is in the wild.

Ваша ссылка не работает. Нажмите кнопку share под ответом, на который вы хотите создать ссылку, и используйте URL-адрес в формате stackoverflow.com/a/406775/49942.

ChrisW 06.01.2014 22:00

На мой взгляд, в этом обсуждении упущен очень важный момент:

Это действительно зависит от того, что это за проект!

Если вы создаете собственный проект (C / C++), вы фактически будете вынуждены создавать отладочные сборки просто потому, что в некоторых случаях оптимизация компилятора может сделать отладку практически невозможной.

Если вы создаете веб-приложения, вы, возможно, захотите просто создать одну сборку (хотя «сборка» вводит в заблуждение для некоторых веб-приложений), которая может включать функции ведения журнала во время выполнения.

Хотя нативный проект C++ и веб-приложение PHP, очевидно, не являются всеми видами проектов, я надеюсь, что моя точка зрения дошла до меня.

P.S .: При разработке для C# вы сталкиваетесь с пограничным случаем, поскольку, хотя использование отладочной сборки отключает оптимизацию компилятора, по моему опыту вы не столкнетесь почти с такими различиями, как с C++

Это правда. Я говорю, что даже в проекте C++, поскольку вам необходимо поддерживать (и, следовательно, может потребоваться отладка) выпущенное программное обеспечение, поэтому даже сборка Release должна быть отлаживаемой ... и, следовательно, вам не нужно ( И ИМО не хочет) отдельную сборку «Отладка».

ChrisW 12.02.2009 21:51

Я полностью согласен с тем, что «отладочная сборка» даже в проекте C++ должна в основном состоять из изменения параметров компилятора, а не из выполняемого кода.

gha.st 13.02.2009 23:24

Удаляя «цель отладки», вы заставляете разработчиков выполнять отладку окончательной версии программного обеспечения. На практике это, вероятно, означает две вещи:

1) "Релизные сборки" будут иметь отключенную оптимизацию (сторонние разработчики не могут использовать отладчик)

2) Никакие сборки не будут иметь специальных макросов PREPROCESSOR, изменяющих их выполнение.

Так что на самом деле вы будете объединять конфигурации выпуска и отладки, а не устранять только режим «отладки».

Я лично сделал это с разработкой для iOS без каких-либо негативных последствий. Время, потраченное на наш написанный код, составляет менее 1% от того, что действительно происходит, поэтому оптимизации не внесли значительного вклада. В этом случае они действительно, похоже, вызвали увеличение количества ошибок, но даже если они этого не сделали, идея тестирования одним способом, а затем предоставления QA с другим кодом представляет собой еще один фактор, который следует учитывать при проблемах.

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

Другие вопросы по теме