Здавалка
Главная | Обратная связь

Налаштування програми



Розглянемо більш детально типи помилок і повідомлень та методи їх усунення.

Процес усунення помилок у програмі називається налаштуванням (debugging), а самі помилки в програмі досить часто називають жучками (bugs). Серед помилок, які допускаються в програмі, виділяють синтаксичні помил­ки, помилки часу виконання і логічні помилки.

Синтаксичні помилки – це помилки, пов’язані з порушенням синтак­сису (тобто правил граматики) мови програмування. Прикладом такої помил­ки, що часто зустрічається в програмах, є пропуск символу «крапка з ко­мою», яким завершується кожен оператор у програмах, написаних мовою C++. При виявленні синтаксичної помилки компілятор видає повідомлення про помилку, вказуючи її передбачуване місце розташуван­ня і пояс­нюючи можливий її зміст. Звісно, природа помилки може від­різнятися від тієї її ін­терпретації, яку робить компілятор, тим більше що одна синтаксична помил­ка може призвести до того, що компілятор видасть декілька повідом­лень про помилки, зумовлені, проте, наявністю лише першої з них. Може бути і про­тилежний випадок, коли одна синтаксична помилка приховує від ком­пілятора інші помилки, що наявні далі в тексті програми.

Досить часто компілятор виводить попереджувальні повідомлення про деякі дещо незвичні конструкції у програмі. У багатьох випадках програ­місти звертають увагу тільки на повідомлення компілятора про наявність по­милок (Errors), не реагуючи на попередження (Warnings). У той же час попе­реджувальні повідомлення можуть свідчити про помилки, у зв’язку з чим на них варто обов’язково звертати увагу і вносити відповідні виправ­лення. В ідеаль­ному випадку попереджувальні повідомлення відсутні.

Для запуску процесу компіляції cpp-файлу, ім’я якого виділене в Solu­tion Explorer або завантажене на активну сторінку вікна коду, слід виконати команду Build ►Compile (Побудування ►Компіляція), якій відповідає гаряча кла­віша Ctrl+F7, або команду Compile (Компіляція) у контекстному меню, що від­кривається при кліку правою клавішею мишки над іменем cpp-файлу в Solu­tion 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++ такі помилки називаються винятками (Ex­ceptions). З появою таких помилок програма завершується аварійно з вида­чею пояснювального повідомлення. У середовищі поява таких помилок при­зво­дить до переривання виконання програми і виведення вікна з інформацією про вид винятку. Прикладами таких помилок часу виконання є ділення на нуль, одер­жання великих числових значень, які не можуть бути записані в комірку пам’яті (переповнення). Наприклад, на рис. 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 або за допомогою контекстного меню (опція Dele­te 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 Все права принадлежат авторам размещенных материалов.