Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Опции компилятора задаваемые в настройках


Автор: Delphist 12.2.2009, 17:14
В окне опции (Project->Options->Compiler) в IDE Delphi задаются настройка компилятора. На прикрепленном рисунке я красными квадратиками пометил 3 интересующие меня опции, в связи с которыми у меня возникли вопрос:
1) Если все эти опции снять для выходного (итогового) проекта как они повлияют на него, ну понятно размер уменьшиться, а еще
на что повлияют
2) Какие есть аналоги этим опциям для управлениями ими из под исходника, вот например для опции Optimization есть 
{$OPTIMIZATION ON}
{$OPTIMIZATION OFF}

Автор: bems 12.2.2009, 17:46
Stack frames влияет на возможность использовать внешние дебаггеры и профайлеры
Debug information - возможность отладки
Use debug DCUs - возможность отладки с входом в библиотечные исходники

Автор: Snowy 12.2.2009, 17:47
Кроме Debug Information не нужно ничего снимать.
А посмотреть директивы очень просто. Зажми Ctrl и нажми 2 раза букву O.

Автор: Delphist 12.2.2009, 17:55
Цитата(Snowy @  12.2.2009,  18:47 Найти цитируемый пост)
Кроме Debug Information не нужно ничего снимать.

Скажи, пожалуйста, а почему не нужно выключать опцию:
Stack frames 
Use debug DCUs
 для выходного файла

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

Автор: CodeMonkey 12.2.2009, 17:58
F1:

Цитата
Программа представляет собой набор машинных команд. Текст программы представляет собой текстовый файл. Вопрос: как отладчик узнаёт, когда надо остановиться, если вы поставили бряк на строку в тексте? Где же соответствие между текстовым файлом и набором байт в exe-файле? Вот для такой связи и служит отладочная информация. Это, грубо говоря, набор инструкций типа: «машинные коды с 1056 по 1059 относятся к строке 234 модуля Unit1.pas». Вот с помощью такой информации и работает отладчик. По-умолчанию она включена. Делается это в опциях проекта на вкладке «Compiler» в разделе «Debugging». Обычно они все (или почти все) включены для отладочной версии программы и отключаются для конечной версии, которую вы будете распространять. Напомним, что после переключения любой из этих опций необходимо делать полный Build проекта, чтобы опция вступила в силу. 
«Debug information» (директива {$D+} или {$D-}) – это собственно и есть отладочная информация. Т.е. соответствие между текстом программы и её машинным кодом. Вы должны включить эту опцию, если хотите ставить бряки и выполнять пошаговую отладку. Отладочная информация сохраняется вместе с кодом модуля в dcu-файле. Т.е. один и тот же Unit1.dcu может быть скомпилирован как с отладочной информацией, так и без неё. Отладочная информация увеличивает время компиляции, размер dcu-файлов, но не влияет на размер и скорость работы полученного exe-файла (т.е. отладочная информация не подключается к exe-файлу). 
«Local symbols» (директива {$L+} или {$L-}) – является дополнением к отладочной информации. Она отвечает за соответствие между данными в exe-файле и именами переменных. Если вы включаете эту опцию, то отладчик позволит вам просматривать и изменять переменные. Также окно «Call Stack» будет способно отражать переданные в процедуры параметры.
«Reference info» – это дополнительная информация для редактора кода, которая позволяет ему отображать более подробную информацию об идентификаторах. Например, где была объявлена переменная.
«Use Debug DCUs» - эта опция переключает сборку вашей программы с отладочными модулями Delphi или с обычными. Если вы внимательно посмотрите на установку Delphi, то увидите, что pas файлы из папки Source никогда не используются для компиляции - а только для отладки. Для компиляции же используются уже готовые dcu-файлы из папки Lib. Это уменьшает время компиляции. Поскольку dcu могут быть скомпилированы с отладочной информацией и без неё, то в папке Lib есть два набора dcu-файлов: обычные и отладочные. Переключая эту опцию, вы указываете, какие из них использовать. Если вы выключите эту опцию, то не сможете заходить по F7 в стандартные функции и методы Delphi (т.к. для них будет отсутствовать отладочная информация).


Добавлено через 3 минуты и 37 секунд
Цитата(Delphist @  12.2.2009,  17:55 Найти цитируемый пост)
а вот в релизном проекте, зачем нам нужны эти опции

Для всякой http://forum.vingrad.ru/index.php?showtopic=235599&view=findpost&p=1694019.

Автор: Delphist 12.2.2009, 18:19
Цитата(CodeMonkey @  12.2.2009,  18:58 Найти цитируемый пост)
F1:
Цитата
Программа представляет собой набор машинных команд. Текст программы представляет собой текстовый файл. Вопрос: как отладчик узнаёт, когда надо остановиться, если вы поставили бряк на строку в тексте? Где же соответствие между текстовым файлом и набором байт в exe-


Я так понимаю для релизной версии необходимо выключать Use debug DCUs, Local symbols ({$L-})  и Debug information({$D-}), остальные должны быть включены.

Правильно ли я понял?

Автор: cemick 12.2.2009, 18:24
Еще включать опимизацию и выключать стек

Автор: Delphist 12.2.2009, 18:30
Цитата(cemick @  12.2.2009,  19:24 Найти цитируемый пост)
Еще включать опимизацию и выключать стек 

Значит получается, что для релиза нужно сделать так:
{$OPTIMIZATION ON}
Use debug DCUs (выключить, интересен аналог через директиву)
Stack frames (выключить, интересен аналог через директиву)
Local symbols ({$L-}) 
Debug information({$D-})


Правильно ли?

Автор: CodeMonkey 12.2.2009, 20:41
Зависит от того, какой программы. 

Обычная программа:

Все опции отладки (debug information и т.п.) вообще на готовый модуль не влияют, т.к. отладочная информация в exe/DLL не хранится => смысла их выключать я не вижу (Use Debug DCUs - по вкусу).
Оптимизацию я вообще не вижу смысла выключать. Разве что совсем страшное что-то напишете.
Stack Frames вообще включать незачем.
Генерацию map-файла выключаем.
Include TD32 debug info - включаем только для отладки внешнего процесса.
Соответственно, Include remote debug info - включаем только для удалённой отладки. 

Программа, в которой используется механизм диагностики исключений (грубо говоря) - например, JclHookExcept/JclDebug, EurekaLog, madExcept:

Все опции отладки (debug information и т.п.) держать включёнными, т.к. в противном случае не будет доступна отладочная информация. Соответственно, ваши информационные механизмы пойдут лесом. Use Debug DCUs если при отладке ещё можно ставить по вкусу, то для релиза - строго включать.
Оптимизацию я вообще не вижу смысла выключать. Разве что совсем страшное что-то напишете.
Stack Frames вообще вЫключать незачем.
Генерацию map-файла включаем на полную (ок, некоторые эксперты включают это автоматом).
Include TD32 debug info - включаем только для отладки внешнего процесса.
Соответственно, Include remote debug info - включаем только для удалённой отладки. 

P.S. Все директивы можно посмотреть в справке. Неужели так сложно нажать F1 в окне настроек проекта на вкладке Compiler?

Автор: bems 12.2.2009, 20:55
Цитата(CodeMonkey @  12.2.2009,  20:41 Найти цитируемый пост)
Stack Frames вообще вЫключать незачем.
ну местами это позволяет увеличить возможную глубину рекурсии

Автор: Delphist 13.2.2009, 10:38
Цитата(CodeMonkey @  12.2.2009,  21:41 Найти цитируемый пост)
Обычная программа:


CodeMonkey, меня именно интересовала обычная программа. 
Вот только не понятно, что делать с Local symbols включать или вЫключать для обычной релизной проги?
И что значит Use Debug DCUs - по вкусу smile 

Автор: CodeMonkey 13.2.2009, 19:02
Цитата(bems @  12.2.2009,  20:55 Найти цитируемый пост)
ну местами это позволяет увеличить возможную глубину рекурсии

Да, понятно, но речь шла об опциях проекта, а не локальных настройках.

>>> Вот только не понятно, что делать с Local symbols включать или вЫключать для обычной релизной проги?
Ещё раз для тех, кто не читает: все опции отладки (debug info, local symbols, ref info) выключать не имеет смысла.

>>> И что значит Use Debug DCUs - по вкусу
То и значит. А у вас есть два варианта трактовки этих слов? smile 

Автор: Delphist 13.2.2009, 19:52
Цитата(CodeMonkey @  13.2.2009,  20:02 Найти цитируемый пост)
 и значит. А у вас есть два варианта трактовки этих слов? 

Use Debug DCUs вообще нужен ли экзешнику? Или он на него никак не влияет

Автор: Christoph 13.2.2009, 21:09
Цитата(Delphist @ 13.2.2009,  19:52)
Цитата(CodeMonkey @  13.2.2009,  20:02 Найти цитируемый пост)
 и значит. А у вас есть два варианта трактовки этих слов? 

Use Debug DCUs вообще нужен ли экзешнику? Или он на него никак не влияет

Use Debug DCUs использование отладочных версий стандартных модулей библиотеки компонентов VCL
То есть во время отлдаки можно посмотреть что делается с VCL,клавишой ф7

Автор: Pavelbej 14.2.2009, 00:56
В моем проекте (Delphi 7) включение Use Debug DCU делает екзешник на 120 КБайт больше.

Автор: CodeMonkey 14.2.2009, 12:55
Цитата(Pavelbej @  14.2.2009,  00:56 Найти цитируемый пост)
В моем проекте (Delphi 7) включение Use Debug DCU делает екзешник на 120 КБайт больше.

Только виновата в этом не сама опция, а какой-то другой код. Опция ничего не делает, кроме как меняет набор DCU-х. Одни из которых собраны с отладочной информацией, вторые - без. Отладочная информация по-умолчанию в exe не идёт. Соответственно, переключение опции вообще не влияет на окончательный exe-файл (*). 
Но если вы используете, например, JCL, madExcept, EurekaLog или аналогичные инструменты - то, разумеется, эта опция будет влиять на результат.

P.S.
(*) Строго говоря, это не совсем верно. Иногда отладочные и релизные версии DCU-х отличаются незначительными изменениями кода. Например, http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=66136 (для упрощения отладки). Иногда может отключаться оптимизация. Но влияние этих изменений очень мало. Например, в D2009 (несмотря на отличия debug и release DCU) переключение опции не изменяет размер exe (в нём меняется всего несколько байт).

Автор: Bose 15.2.2009, 01:51
smile 
Delphist вернулся, и как всегда тупит жжот  smile

Добавлено @ 01:52
сорри за оффтоп smile

Автор: Delphist 16.2.2009, 10:03
Цитата(Bose @  15.2.2009,  02:51 Найти цитируемый пост)
Delphist вернулся, и как всегда тупит жжот  

Мой стиль smile , чтоб сразу угадывали smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)