Существует ли автоматический способ удаления методов отладки для сборки выпуска? - PullRequest
2 голосов
/ 24 декабря 2010

Примечание. Это расширение более раннего вопроса, который я задал здесь: Увеличивают ли дополнительные определения функций / методов объем памяти программы?

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

Я задаю этот вопрос как с точки зрения C ++, так и с точки зрения Java. Я использую Code :: Blocks и Eclipse в качестве IDE, если это как-то влияет на ответ.

Ответы [ 5 ]

5 голосов
/ 24 декабря 2010

Для C ++ вы можете использовать макросы препроцессора:

#ifnef NDEBUG
void dbgFunction() { ... }
#endif

NDEBUG - это стандартный макрос, используемый assert: ваши assert ионы не будут оцениваться, еслиNDEBUG установлено.


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

4 голосов
/ 24 декабря 2010

С точки зрения Java, существует множество стратегий:

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

  • Если это полный метод, который не используется в производственном коде, оставьте его там. Во время выполнения JIT-компилятор заметит, что он не используется, и не потрудится скомпилировать его. Код все еще может быть там во время выполнения (в виде некомпилированных байт-кодов), но влияние на объем памяти будет незначительным ... учитывая, что JVM требуется несколько мегабайт пространства кучи только для начала.

  • Если это класс или коллекция классов (например, тестовые классы JUnit), поместите его / их в параллельный пакет с «test» где-нибудь в имени пакета и отфильтруйте его / их при создании JAR-файл.

  • Если вы используете Maven, поместите тестовые классы в каталог "src / test / java", а не в "src / main / java", и команда maven автоматически исключит их.

Некоторые разработчики рекомендуют использовать препроцессор исходного кода с Java, но большинство скажет, что это плохая идея; то есть это создает больше проблем, чем решает. Для начала, основные Java IDE и отладчики не понимают директив пропроцессора, поэтому вы столкнетесь с различными проблемами, связанными с инструментами. Кроме того, это не «путь Java».

3 голосов
/ 24 декабря 2010

Чтобы добавить ответ peoro в C ++, в ваших проектах релизов всегда должен быть определен NDEBUG, а в ваших проектах отладки всегда должен быть определен _DEBUG, чтобы вы могли проверять любой из них или создавать собственные директивы препроцессора для исключения кода.

Мне лично очень полезно время от времени иметь несколько моих собственных директив препроцессора, и отличное место для их размещения - в stdafx.h, если вы используете предварительно скомпилированные заголовочные файлы.Вы можете отключить целые функции или части кода, которые могут быть в процессе разработки или просто нежелательны для определенных сборок.Например, в одном приложении путем изменения одного определения я могу переключиться с OpenGl на DirectX или полностью исключить 3D-рендеринг из проекта.

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

2 голосов
/ 24 декабря 2010

В мире Java вы можете использовать log4j для всех ваших целей ведения журналов, имея отладочную запись в коде как log.debug().В вашем производственном коде вы можете запустить код с уровнем свойства log4j в любом месте выше DEBUG, например INFO.Вы можете получить более подробную информацию здесь .

2 голосов
/ 24 декабря 2010

Использовать препроцессорные переключатели

#ifdef MY_DEBUG_SWITCH
// debug code goes here
#endif
...