Читати онлайн C

онлайн

1.21. Створення налагоджувального складання

Ви хочете зібрати версію проекту, яку можна буде легко налагоджувати.

В основному для отримання налагоджувального складання потрібно:

• вимкнути розширення вбудованих (inline) функцій;

• включити генерацію налагоджувальної інформації.

Таблиця 1.20 представляє опції компілятора та компонувальника, призначені для відключення оптимізації та вбудовування функцій, а табл. 1.21 представляє опції компілятора та компонувальника для включення налагоджувальної інформації.

Табл. 1.20. Вимкнення оптимізації та вбудовування з командного рядка

Інструментарії Оптимізація Вбудовування
GCC-O0-fno-inline ¹
Visual C++ Intel (Windows)-Od-Ob0
Intel (Linux)-O0-Ob0
-opt off-inline off
Comeau (Unix)-O0--no_inlining
Comeau (Windows)Те ж, що й у основного компілятора, але замість тире (-) використовується сліш (/)
Borland-Od-vi-
Digital Mars-o+none -S-C

¹ Цю опцію вказувати не потрібно, якщо не вказано опцію -O3 .

Табл. 1.21. Опції командного рядка для включення налагоджувальної інформації

Інструментарії Опції компілятора Опції компонувальника
Comeau (Unix) GCC-g-g
Intel (Linux) Metrowerks
Visual C++ Intel (Windows)табл. 1.22табл. 1 22
Comeau (Windows)Те ж, що й у основного компілятора, але замість тире (-) використовується сліш (/)Те саме, що й у основного компілятора, але замість тире (-) використовується сліш (/)
Borland-v-v
Digital Mars-g-co

Табл. 1.22. Увімкнення налагоджувальної інформації під час використання Visual C++ або Intel для Windows

Опції компілятора Опції компонувальника IDE options¹ Опис
-Z7-debugC7 Compatible (сумісність із C7)Відлагоджувальна інформація зберігається у файлах .obj та .exe
-Zi [-Fd

].-debug[-pdb:

]Program Database (база даних програми)Відлагоджувальна інформація зберігається у файлах .pdb; опція у квадратних дужках використовується для вказівки файлів .pdb-Zi [-Fd

]-debug [-pdb:

]Program Database for Edit & Continue (база даних програми для редагування та продовження)Відлагоджувальна інформація зберігається у файлах. pdb; опція у квадратних дужках використовується для вказівки файлів .pdb. Програму можна перекомпілювати під час сесії налагодження

¹ Щоб отримати доступ до цих опцій, перейдіть до Configuration Properties→C/C++→ General→Debug Information Format (формат налагоджувальної інформації).

BoostBuild надає схожий механізм створення налагоджувального складання: просто додайте до вимог мети debug або використовуйте опцію командного рядка variant=debug , яку можна скоротити до debug .

Деякі IDE також надають простий спосіб створення налагоджувального складання. Наприклад, при створенні нового проекту у Visual C++ IDEавтоматично генерує конфігурації для налагоджувальної та остаточної збірки. Щоб запросити налагоджувальну збірку, просто виберіть в меню Build опцію Configuration Manager і як активну виберіть конфігурацію Debug. Також можна вибрати Debug у списку конфігурацій, що розкривається, на стандартній панелі інструментів. При наступному складанні проекту буде створено налагоджувальне складання.

Аналогічно при створенні проекту в CodeWarrior за допомогою одного із шаблонів проектів Metrowerks, званих «приналежності» (stationery), IDE автоматично генерує налагоджувальну та остаточну мету. Ім'я налагоджувальної мети може бути різним, але воно завжди має містити слово "debug". Щоб запросити налагоджувальну збірку, в меню Project виберіть Set Default Target (Встановити ціль за замовчуванням), а потім виберіть елемент меню, що відповідає налагоджувальній меті. Також можна вибрати налагоджувальну мету в списку цілей у вікні проекту.

C++Builder не підтримує множинних конфігурацій для одного проекту, але він надає простий спосіб створення налагоджувального складання. Щоб запросити налагоджувальну збірку, перейдіть до Project Options→Compiler і натисніть Full debug (повне налагодження). Це відключить усі оптимізації та вбудовування та включить налагоджувальну інформацію.

При використанні IDE, яка не надає готових конфігурацій налагодження та остаточної, такої як Dev-C++, або якщо вам потрібно отримати додатковий контроль над параметрами проекту, зверніться до таблиць з 1.23 до 1.25.

Табл. 1.23. Вимкнення оптимізації з IDE

IDE Конфігурація
Visual C++На сторінках властивостей проекту перейдіть до Configuration Properties→C/C++→Optimization та встановіть опцію Optimization у значення Disabled (вимкнено). Для іншихопцій на цій сторінці залиште значення за замовчуванням
CodeWarriorУ вікні Target Settings перейдіть до Code Generation→Global Optimizations (генерація коду→глобальна оптимізація) та виберіть Off (викл)
C++BuilderУ Project Options перейдіть до Compiler, у розділі Code optimization (оптимізація коду) виберіть None
Dev-C++У Project Options перейдіть до Compiler→Optimization та встановіть опцію Perform a number of minor optimizations (виконати кілька незначних оптимізації) у значення No (ні), потім перейдіть до Compiler→Optimization→Further optimizations (додаткові оптимізації) та встановіть опції Optimize (оптимізації) , Optimize more (додатково оптимізувати) та Best Optimization (найкраща оптимізація) у значення No

Табл. 1.24. Вимкнення вбудовування з IDE

IDE Конфігурація
Visual C++На сторінках властивостей проекту перейдіть до Configuration Properties→C/C++→Optimization і встановіть опцію Inline Function Expansion (розширення функцій, що вбудовуються) у значення Default (за замовчуванням)
CodeWarriorУ вікні Target Settings перейдіть до Language Settings→C/C++ Language та встановіть Inline Depth (глибина вбудовування) у значення Don't Inline (не вбудовувати)
C++BuilderУ Project Options перейдіть до Compiler і в розділі Debugging установіть прапорець Disable inline expansions (вимкнути вбудовування функцій)
Dev-C++Див. запис для GCC у табл. 1.20 та зверніться до рецепту 1.20

Табл. 1.25. Включення налагоджувальної інформації в IDE

IDE Конфігурація
Visual C++табл. 1.22
CodeWarriorУ вікні Target Settings перейдіть до Language Settings→Linker→PPC Mac OS X Linker та встановіть прапорці Generate SYM File (генерувати SYM-файл) та Full Path in SYM Files (повні шляхи у SYM-файлах)
C++BuilderУ Project Options перейдіть до Compiler та встановіть прапорці Debug information та Line Number Information (інформація про номери рядків)
Dev-C++Див. запис для GCC у табл. 1.21 та зверніться до рецепту 1.20
Обговорення

Усі набори інструментів надають опції для генерації в об'єктних та виконуваних файлах інформації, яка дозволяє налагоджувачам повідомляти корисні дані при покроковому виконанні програми. Ця інформація зазвичай включає імена вихідних файлів та номери рядків, що відповідають певному об'єкту або інструкціям машинного коду, а також інформацію про об'єкти С++, що займають певні області пам'яті, включаючи їх імена та типи.

Більшість наборів інструментів зберігають інформацію налагодження безпосередньо в об'єктних і виконуваних файлах, але деякі також надають опцію для генерації налагоджувальної інформації в окремих файлах бази даних. Наприклад, Visual C++ опція компілятора -Z7 вказує, що налагоджувальна інформація повинна бути поміщена в об'єктні та виконувані файли, а опції -Zi і -ZI вказують, що вона повинна бути збережена у файлах бази даних програми, що мають розширення .pdb . Опція -ZI включає функцію, яка називається Edit and Continue (відредагувати та продовжити), яка дозволяє користувачам IDE змінювати та перекомпілювати код, не перериваючи сесії налагодження. Аналогічно CodeWarrior для Mac OS X за умовчанням генерує налагоджувальну інформацію у файлах .SYM.

Більшість наборів інструментів може генерувати налагоджувальнуінформацію навіть із включеними оптимізаціями та вбудовуванням, хоча в деяких випадках налагоджувальна інформація може виявитися несумісною з деякими видами оптимізації. Однак при включенні оптимізації компілятор може збільшити ефективність коду, змінивши порядок проходження операторів або повністю реорганізувавши фрагменти коду, тоді як зовні його поведінка залишиться незмінною. Це робить налагодження більш складним, так як при цьому втрачається сувора відповідність між частинами вихідного коду та місцями розташування об'єктів і машинним кодом. Це ж вірно і для вбудовування: коли компілятор розкриває функцію, що вбудовується, об'єктний код, відповідний цій функції, генерується в тілі викликає функції. При виконанні цього коду для вбудованої функції не створюється стековий кадр. Окрім іншого це означає, що відладчик не зможе відобразити значення аргументів функції та її локальних змінних. Зазвичай, відладчики навіть не намагаються повідомляти про місця у вихідному коді, що відповідають тілам вбудованих функцій.

З цих причин зазвичай при створенні налагоджувального складання прийнято відключати оптимізації та вбудовування.