Налаштування програми
Розглянемо більш детально типи помилок і повідомлень та методи їх усунення. Процес усунення помилок у програмі називається налаштуванням (debugging), а самі помилки в програмі досить часто називають жучками (bugs). Серед помилок, які допускаються в програмі, виділяють синтаксичні помилки, помилки часу виконання і логічні помилки. Синтаксичні помилки – це помилки, пов’язані з порушенням синтаксису (тобто правил граматики) мови програмування. Прикладом такої помилки, що часто зустрічається в програмах, є пропуск символу «крапка з комою», яким завершується кожен оператор у програмах, написаних мовою C++. При виявленні синтаксичної помилки компілятор видає повідомлення про помилку, вказуючи її передбачуване місце розташування і пояснюючи можливий її зміст. Звісно, природа помилки може відрізнятися від тієї її інтерпретації, яку робить компілятор, тим більше що одна синтаксична помилка може призвести до того, що компілятор видасть декілька повідомлень про помилки, зумовлені, проте, наявністю лише першої з них. Може бути і протилежний випадок, коли одна синтаксична помилка приховує від компілятора інші помилки, що наявні далі в тексті програми. Досить часто компілятор виводить попереджувальні повідомлення про деякі дещо незвичні конструкції у програмі. У багатьох випадках програмісти звертають увагу тільки на повідомлення компілятора про наявність помилок (Errors), не реагуючи на попередження (Warnings). У той же час попереджувальні повідомлення можуть свідчити про помилки, у зв’язку з чим на них варто обов’язково звертати увагу і вносити відповідні виправлення. В ідеальному випадку попереджувальні повідомлення відсутні. Для запуску процесу компіляції cpp-файлу, ім’я якого виділене в Solution Explorer або завантажене на активну сторінку вікна коду, слід виконати команду Build ►Compile (Побудування ►Компіляція), якій відповідає гаряча клавіша Ctrl+F7, або команду Compile (Компіляція) у контекстному меню, що відкривається при кліку правою клавішею мишки над іменем cpp-файлу в Solution Explorer. Формально файл, що містить програмний код, може бути направлений і на обробку компонувальником, для чого слід виконати команду Build ►Build ім’я файлу (Побудування ►Побудування ім’я файлу). При цьому перед компонуванням виконується попередня компіляція файлу. Компонування виконуватиметься тільки в разі успішної компіляції. Для компіляції програми разом з компонуванням слід обрати пункт меню Build ►Build Solution (Побудування ►Побудування розв’язку) – гаряча клавіша Ctrl+Shift+B (залежно від варіанту інсталяції за умовчанням може бути встановлена клавіша F6). Якщо створений програмний код є некоректним, то по закінченню процесу компіляції і компонування у вікні Error List (Список помилок) буде виведено інформацію про виявлені Помилки (Errors), Попередження (Warnings) та Повідомлення (Messages); див. рис. 1.13. Рис. 1.13 – Вікно Error List з інформацією про помилки Процес компіляції відображується і у вікні Output (Виведення), де також виводиться інформація про помилки і попередження в разі їх наявності (див. рис. 1.14). Рис. 1.14 – Вікно Output з інформацією про помилки Можливим є також вибір пункту меню Debug ►Start Debugging (Налаштування ►Почати налаштування). Ця ж команда виконується за натисканням гарячої клавіші F5 або за кліком мишкою над інструментальною кнопкою ). Можна також натиснути гарячу клавішу Ctrl+F5, що відповідає виконанню команди меню Debug ►Start Without Debugging (Налаштування ►Почати без налаштування). У цих випадках, насправді, мова йде про запуск програми на виконання. Але перед виконанням програми, якщо в її тексті здійснювалася корекція, будуть автоматично виконані компіляція програми та компонування. У разі відсутності синтаксичних помилок програма буде автоматично запущена. Якщо ж помилки будуть виявлені, на екран виводиться зображене на рис. 1.15 діалогове віконце з попередженням про появу помилки компонування і запитанням про згоду на виконання останнього успішного варіанту компонування. Рис. 1.15 – Діалогове віконце помилки компонування Якщо в цьому віконці встановити прапорець Do not show this dialog again (Не показувати цей діалог), то в подальшому воно не буде виводитися, а програма виконуватиметься навіть при наявності помилок (точніше виконуватиметься останній успішний варіант компонування). Тому цей прапорець краще на встановлювати. Відновлення виведення вказаного діалогового віконця в разі його відміни здійснюється виконанням команди меню Debug ►Options and settings… (Налаштування ►Параметри і настроювання…), за якою відкривається вікно Options (Параметри). Далі потрібно розвернути список Projects and Solutions (Проекти і розв’язки), в якому вибрати пункт Build and Run (Побудування та запуск). Після вибору цього пункту в правій частині вікна Options виведеться декілька списків, що розкриваються. Одним з них є список On Run, when projects are out of date: (Запуск застарілого проекту:). Він має три пункти: Prompt to launch – Підказувати перед запуском Do not launch – Не запускати Launch old version – Запуск старої версії Далі потрібно вибрати в цьому списку пункт Prompt to launch і підтвердити вибір кліком мишкою над кнопкою OK (можна також рекомендувати вибір пункту Do not launch). Перед натисканням кнопки OK можна встановити прапорець For new solutions use the currently selected project as the startup project (Для нових розв’язків використовувати вибраний варіант запуску проекту). Для виведення вікна Options замість команди Debug ►Options можливе також використання команди Tools ►Options… (Сервіс ►Параметри…). Відзначимо, що вікна Error List і Output можуть бути закриті. Для відкриття цих вікон потрібно виконати відповідно команди View ►Error List (Перегляд ►Список помилок) і View ►Output (Перегляд ►Виведення). Їм відповідають послідовне натискання клавіш Ctrl+\, E, а також комбінація клавіш Ctrl+Alt+O. Деякі помилки проявляються тільки під час виконання програми, у зв’язку з чим вони носять відповідну назву – помилки часу виконання (run-time errors). У термінології C++ такі помилки називаються винятками (Exceptions). З появою таких помилок програма завершується аварійно з видачею пояснювального повідомлення. У середовищі поява таких помилок призводить до переривання виконання програми і виведення вікна з інформацією про вид винятку. Прикладами таких помилок часу виконання є ділення на нуль, одержання великих числових значень, які не можуть бути записані в комірку пам’яті (переповнення). Наприклад, на рис. 1.16 зображене вікно, яке висвітлюється у випадку, коли виконується ділення на нуль при обробці двох цілих значень. Рис. 1.16 - Вікно виникнення виключення Найбільш неприємними є логічні помилки – помилки в самому алгоритмі і помилки, спричинені елементарною неуважністю (наприклад, використання в програмі операції * замість операції +, задавання неправильного числового значення, використання одного імені змінної замість іншого). Такі помилки компілятор найчастіше за все виявити не може (за винятком випадків, коли вони призводять до порушення синтаксису). Більш того, логічні помилки можуть не проявити себе і при виконання програми. Для виявлення логічних помилок здійснюється тестування програми, яке виражається в її запуску з кількома характерними наборами вхідних даних і перевірці відповідних їм результатів. При цьому в жодному разі не можна обмежуватися одноразовою перевіркою програми – повинні бути відстежені всі окремі випадки вхідних даних, з якими програма може зіткнутися. Тільки після перевірки правильності функціонування програми на багатьох наборах даних, як типових, так і тих, що характеризують особливі випадки, можна отримати високу (але не абсолютну) гарантію її правильності. Найчастіше за все, щоб знайти причину логічної помилки, треба виконати якийсь фрагмент програми, спостерігаючи значення змінних при виконанні кожної команди. Для виявлення більшості логічних помилок використовують так званий налаштувальник (Debugger). Робота в режимі налаштування – це, насамперед, виконання програми по кроках з відстеженням послідовності виконання операторів програми та значень, які набувають змінні після виконання того або іншого кроку. Для виконання фрагменту програми по кроках можна використовувати такі команди меню: Ø Debug ►Step Into (Налаштування ►Крок із заходом у ...) – покрокове виконання програми із заходом у функції з наступним покроковим виконанням їх рядків; аналогом є натискання клавіші F11 або клік мишкою над інструментальною кнопкою у панелі Debug (Налаштування), яка автоматично висвітлюється в інтегрованому середовищі в разі зупинки виконання програми під час налаштування; Ø Debug ►Step Over (Налаштування ►Крок з обходом) – покрокове виконання рядків програми, при якому виклик функції вважається за одну команду, тобто вхід у функції не проводиться (аналогом є натискання клавіші F10 або клік мишкою над інструментальною кнопкою у панелі Debug); Ø Debug ► Step Out (Налаштування ►Вийти) – виконання програми до виходу з поточної функції і зупинка на операторі, наступному за викликом цієї функції, з залишенням курсору в рядку, в якому було здійснене звертання до функції (аналогом є натискання клавіші Shift+F8 або клік мишкою над інструментальною кнопкою на панелі Debug). Можливе також виконання команди Run to Cursor (Виконати до курсору), яка викликається при натисканні комбінації клавіш Ctrl+F10. У цьому разі програма виконується до рядка, в якому знаходиться курсор. Для налаштування програми використовуються так звані точки переривання. Щоб увести просту (безумовну) точку переривання, достатньо у вікні редактора коду клікнути мишкою на лівій межі вікна навпроти рядка коду, перед виконанням якого потрібно призупинити обчислення для аналізу проміжних результатів. При цьому навпроти рядка на лівій межі вікна коду з’явиться червона кулька. Якщо тепер запустити програму на виконання, то кожен раз коли керування перейде до рядка, в якому вказана точка переривання, відбуватиметься переривання виконання. Зняти точку переривання можна також кліком мишкою над лівою межею вікна коду. Для встановлення (зняття) точки переривання можна також використовувати гарячу клавішу F9 або команду меню Debug ►Toggle Breakpoint (Налаштування ►Перемикач контрольної точки). Виконання цієї команди встановлює (знищує) точку переривання на рядку, де в момент її виконання знаходиться курсор. Дія точки переривання дещо аналогічна виконанню до курсору (Ctrl+F10), але перевага точок переривання полягає в тому, що можна одночасно вказати декілька таких точок у різних місцях коду і в різних модулях. Програма в цьому разі виконується до першої точки переривання, яка зустрінеться під час виконання. Після аналізу проміжних результатів можна продовжити виконання програми, натиснувши інструментальну кнопку в одній з панелей Debug (Налаштування) або Standard (Стандартна). Можна також натиснути клавіша F5 або виконати команду меню Debug ►Continue (Налаштування ►Продовжити). Для перегляду значення змінних у момент зупинки програми під час налаштування достатньо навести курсор мишки на ім’я необхідної змінної в коді програми. Якщо ж є необхідність відслідковувати стан одразу декількох змінних, це можна зробити у вікнах Autos (Автоматичні, краще Видимі), Locals (Локальні), Watch 1 (Контрольне значення 1), приклади наповнення яких зображені на рис. 1.15–1.17. Можна також відкрити вікна Watch 2, Watch 2 і Watch 3. Рис. 1.15 – Вікно Autos Рис. 1.16 – Вікно Locals За умовчанням три перші з перелічених вище вікна перегляду стану змінних автоматично виводяться в режимі налаштування під вікном коду в лівій частині екрану. У разі відсутності потреби в будь-якому з цих вікон, його можна закрити. Для відкриття такого вікна, необхідно в режимі налаштування вибрати в головному меню опцію Debug ►Windows ►Autos (Налаштування ► Вікна ►Видимі), Debug ►Windows ►Locals (Налаштування ►Вікна ►Локальні) або Debug ► Windows ► Watch ►Watch 1 (Налаштування ► Вікна ► Контрольне значення ►Контрольне значення 1). Для вікон Watch 2, Watch 3, Watch 4 потрібно вибрати команду, що відповідає номеру вікна. Рис. 1.17 – Вікно перегляду стану змінних Watch1 Вікно Autos – це автоматичне вікно, що показує стан локальних змінних які використовуються в поточний момент. Елементами цього вікна є змінні поточного оператора (того, що виділений жовтою стрілкою на лівій межі вікна коду) і попереднього оператора (того, який тільки що був виконаний). Як тільки програма доходить до виконання коду, що не використовує ці змінні, вони зникають з вікна Autos. Вікно Locals – це автоматичне вікно, що показує значення усіх локальних змінних (у тому числі формальних параметрів функції). Елементами цього вікна є всі змінні (навіть однойменні), які існують на даному рівні вкладеності блоків. Контрольовані змінні у вікнах Autos і Locals обирає сам комп’ютер, а не користувач, причому значення виразів у цих вікнах не відображуються Для самостійного вибору змінних і виразів використовуються вікна Watch, яких може бути до чотирьох (Watch1, Watch2, Watch3, Watch 4). Для додавання змінних і виразів у вікна Watch достатньо здійснити клік мишкою в лівій частині пустого рядка такого вікна і увести ім’я змінної або вираз. Якщо виділити рядок вікна Watch і набрати будь-який текст, то цей текст сприймається як вираз, який заміщує текст, що містився раніше в цьому рядку (для змінних ми маємо перейменування). За кліком правою кнопкою мишки у вікні Watch відкривається контекстне меню, в якому можна вибрати опцію Add Watch (Добавити контрольне значення), у результаті чого у вікні з’являється рядок – копія рядка, над яким здійснювався клік. Далі можна виконати перейменування, додавши тим самим нове контрольне значення. Контрольне значення можна додати у вікно Watch «перетаскуванням» з вікна коду або виділенням рядка в одному з вікон Autos і Locals, відкриттям контекстного меню і виконанням команди Add Watch. Видалення контрольного значення здійснюється натисканням клавіші Delete або за допомогою контекстного меню (опція Delete Watch). Значення змінних, що відображені в будь-якому з вікон Watch, можна примусово змінювати. Для цього достатньо виділити це значення у вікні і набрати нове. При подальшому виконанні програми в змінній буде міститися нове значення. Це в складних випадках дозволяє продовжити налаштування програми, не виправляючи помилок вище за її текстом (ніби має місце така ситуація: «Будемо вважати, що змінна x має правильне значення. Як виконуватиметься програма в цьому випадку?»). Можливе також використання вікна QuickWatch (Швидкий перегляд), яке відображується в режимі налаштування за командою Debug ►QuickWatch… (Налаштування ►Швидкий перегляд...) або за командою QuickWatch… контекстного меню чи за послідовним натисканням клавіш Ctrl+D і Q (Ctrl+D, Q); див. рис. 1.18. Рис. 1.18 – Вікно QuickWatch Якщо в цьому вікні набрати і полі Expression (Вираз) деякий вираз або ім’я змінної і натиснути кнопку Add Watch, то вираз чи змінна додаються до вмісту вікна Watch1. У разі натискання кнопки Reevaluate (Переоцінювання) при роботі з вікном QuickWatch у полі Value цього вікна відображується таблиця зі стовпцями Name (Ім’я), Value (Значення), Type (Тип), яка характеризує вираз або змінну з поля Expression. Змінній можна надати нове значення, вказавши його в полі Value цієї таблиці. Відзначимо, що у вказаній таблиці можливе відображення не тільки звичайних змінних чи виразів, а й, наприклад, масивів (див. рис. 1.18). ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|