CMake режим сборки RelWithDebInfo
Я думаю, что я понимаю разницу между режимами выпуска и отладки. Основные отличия в том, что в режиме отладки исполняемый файл не оптимизирован (так как это может затруднить отладку), а также символы отладки.
При создании PCRE, одной из внешних зависимостей для WinMerge, я заметил режим сборки, который я раньше не видел: RelWithDebInfo.
Различие между Debug и RelWithDebInfo упоминается здесь: http://www.cmake.org/pipermail/cmake/2001-October/002479.html.
отрывок: "RelwithDebInfo очень похож на режим Release. Он производит полностью оптимизированный код, но также создает базу данных программы и вставляет информацию об отладочной строке, чтобы дать отладчику хороший шанс угадать, где в коде вы находитесь в любое время".
Это звучит как действительно хорошая идея, однако не обязательно очевидно, как настроить. Эта ссылка описывает, как включить это для VС++: http://www.cygnus-software.com/papers/release_debugging.html
Я что-то упустил или не имеет смысла компилировать весь код выпуска как RelWithDebInfo?
Ответы
Ответ 1
Я что-то упускаю, или это не так иметь смысл скомпилировать весь код выпуска как RelWithDebInfo?
Это зависит от того, насколько вы доверяете своему клиенту информацию об отладке.
Дополнительная информация:
gcc кодирует отладочную информацию в код объекта.
Вот эквивалент pdb для gcc:
Как сгенерировать символ отладки gcc вне цели сборки?
Обратите внимание, что cmake не поддерживает этот подход из коробки.
Ответ 2
Насколько мне известно, код доставки для клиентов, не имеющих соответствующих символов отладки, хранящихся внутри компании, является рецептом для потери волос, когда дело доходит до отладки производственных проблем.
Отладка версий релизов с помощью отладочных символов редко отличается от отладки отладочных сборников, поэтому я рекомендую всегда делать это.
Тем не менее, я не знаю, есть ли недостатки. Было бы интересно услышать, если да.
Ответ 3
Как только вы попытаетесь отладить оптимизированную сборку релизов, вы знаете, почему это то, что вы только хотите делать, когда другого выхода нет.
В принципе, я вижу два случая, когда вам понадобится следующее:
- У вас есть проблема, которая не появляется в отладочных сборках, поэтому вам нужно отлаживать выпускную сборку
- У вас есть авария для клиентов и использование локально хранимой информации об отладке для понимания сбоя.
Я не знаю о вас, но мне пришлось отлаживать код выпуска дважды или трижды за последнее десятилетие, и мне удалось работать в компаниях, где проблемы с клиентами у клиентов не были проблемой.
Да, возможно, неплохо также иметь отладочную информацию для ваших версий релизов, но VS не устанавливает это таким образом, и для двух случаев в каждом десятилетии, где вам это нужно, не стоит устанавливать это вручную каждый раз. Так как CMake дает это бесплатно, сделайте это.
Ответ 4
Производственный код не нуждается в раздувании размера, которое несет отладочная информация.
Ответ 5
Даже когда информация об отладке создается для сборки релиза, она гораздо менее полезна для целей отладки, чем сборка отладки. Причина в том, что многие переменные и промежуточные выражения оптимизированы и, следовательно, недоступны в отладчике.