Налагодження, Налаштування програми - Life-Prog
Налагодження, абоНалаштування програми (англ. debugging) - методичний процес пошуку та зменшення числа помилок чи дефектів у комп'ютерній програмі чи електронному устаткуванні з метою отримання очікуваної поведінки. Налагодження, як правило, стає важчим, коли різні підсистеми сильно пов'язані між собою, оскільки зміни в одній частині можуть викликати помилки в іншій.
Термінологія
Є певні розбіжності щодо походження терміна англ. debugging.
Терміни «bug» та «debugging», кажуть, першою прийняла Грейс Гоппера у 1940-х роках. Коли вона працювала на комп'ютері Mark II у Гарвардському університеті, її співробітники виявили, що моль застрягла в реле і тим самим перешкоджала діям комп'ютера, після чого вона зазначила, що вони робили англ. debug (від англ. bug – жучок, комаха) системи. Однак термін «bug» у сенсі технічної помилки вживався, принаймні ще 1878 року Томасом Едісоном, і «debugging», судячи з усього, використовувався як термін в аеронавтиці перед появою комп'ютерів.
Налагодження, як правило, - тривале та клопітне завдання. Досвід налагодження програміста, ймовірно, є найбільшим фактором успішності та швидкості налагодження, але труднощі з налагодженням програмного забезпечення також залежать багато в чому від мови програмування та використання доступних засобів, таких як наладчик. Відладчик є програмним інструментом, який дозволяє програмісту контролювати виконання програми, зупиняти його, знову запускати, встановлювати точки зупинки, змінювати значення пам'яті і навіть, у випадках, можете повернутися у минуле. ТермінВідладчика може також стосуватися людини, яка робить налагодження.
Взагалі, мови програмування високогорівня, наприклад, Java, що спрощують налагодження, оскільки мають спеціальні особливості, як, наприклад, обробка виняткових ситуацій, що дозволяють швидше локалізувати джерело пороку. У мовах програмування низького рівня, таких як Асемблер, вади найчастіше створюють приховані проблеми, такі як пошкодження пам'яті, і їх набагато важче виявити, оскільки ефект проблеми може з'явитися набагато пізніше після активізації недоліки і форма проблеми може бути зовсім інше. У таких випадках надзвичайно корисні спеціальні програми на кшталт відладчика пам'яті.
У деяких ситуаціях програмні засоби загального призначення, які прив'язані до конкретної мови, можуть бути дуже корисними. Прикладом може бути інструменти статичного аналізу коду. Ці інструменти виконують пошук дуже конкретних відомих (поширених та рідкісних) проблем у сирцевому коді. Проблеми, виявлені цими інструментами, рідко позначаються компілятором чи транслятором, оскільки ці проблеми присутні не так на синтаксичному рівні, але в семантичному. Деякі виробники таких інструментів стверджують, що їхні програми можуть виявити понад 300 унікальних проблем. Такі засоби можуть бути надзвичайно корисними при перевірці великих обсягів сирцевого коду, де дуже неефективно переглядати весь код, або відстежувати всі шляхи його виконання. Типовим прикладом виявленої проблеми може бути звернення до змінної перед тим, як її значення встановлено. Іншим прикладом може бути суворіша перевірка типів, якщо мова такої не має. Таким чином, ці засоби є кращими для виявлення можливих недоліків, на противагу фактичним вадам. Як результат, ці засоби мають високий рівень помилкового спрацьовування. Стародавня утиліта Unix Lint є одним знайстаріших прикладів засобів такого типу.
Для налагодження електронних пристроїв (наприклад, комп'ютерного обладнання), а також програмного забезпечення низького рівня (BIOS, драйвери пристроїв і т.д.) та вбудованих програм, використовуються такі інструменти, як осцилограф, аналізатор логіки, ICE, POST-контролер, що часто використовується та у комбінації. Вони можуть виконувати багато типових дій звичайних налагоджувача на програмному забезпеченні для мікропрограмних засобів.
Процес налагодження
Налагодження печаткою є актом спостереження (наживо або записаних) дій друку, що показують виконання процесу.
Часто перший крок налагодження полягає в тому, щоб спробувати відтворити проблему. Це може бути нетривіальним завданням, наприклад у випадку паралельних процесів або незвичайних помилок програмного забезпечення. Крім того, специфічне застосування програми користувачем або незвичайне оточення може значно ускладнити відтворення проблеми.
Після того, як помилки відтворені, потрібно спростити введення програми для полегшення процесу налагодження. Так, наприклад, помилка компілятора може призвести до збою при обробці великого сирцевого коду. Але після спрощення сценаріїв відтворення проблеми лише кілька рядків з вихідних кодів може бути достатньо, щоб відтворити збій. Таке спрощення можна зробити вручну, за допомогою підходу «розділяй та володарюй». Програміст намагається вилучити деякі частини початкового випробування і перевірити проблему все ще існує. При налагодженні проблем у графічному інтерфейсі, програміст намагатиметься пропустити деякі взаємодії користувача з оригінального опису проблеми і перевірити, чи інші дії є достатніми для виявлення недоліків. Для автоматизації спрощення випробуваньможе використовуватися налагодження дельтою.
Після того, як випробування випадку спрощено достатньо, програміст може використовувати відладчик, щоб вивчити стан програми (значення змінних, стек викликів) і відстежити походження пороку. Або можуть використовуватися трасування. У найпростіших випадках трасування - лише кілька інструкцій висновку, що показує значення змінних у певних точках виконання програми.
Віддалене налагодження - це процес налагодження, коли проблемна програма та відладчик працюють на різних комп'ютерах. Для запуску віддаленого налагодження відладчик підключається до віддаленої системи через мережу. Після того, як зв'язок встановлений, відладчик може контролювати виконання програми на віддаленій системі та отримувати інформацію про її стан.
Посмертне відстеження – це процес аналізу дампи процесу. Дамп процесу може бути отриманий автоматично за допомогою операційної системи, або вручну інтерактивно користувачем. Аварійний дамп (відбиток пам'яті процесу) часто створюються коли процес був припинений після створення виняткової ситуації.
Антиналадчики
Антиналагодження є «здійснення одного або кількох методів у комп'ютерному коді, який перешкоджає спробам реінжинірингу та налагодження цільового процесу». Види підходів:
- На основі API: перевірка на наявність відладчиків, використовуючи інформацію про систему
- На основі винятків: перевіряється, чи йде перехоплення виняткових ситуацій
- Блокування процесів і потоків: перевіряється, чи були маніпуляції з блокуванням процесу або потоків
- Зміна коду: перевіряється чи були зміни в коді, внесені відладчиків для обробітку програмних точок зупинки
- На основі обладнання та регістрів: перевіряються апаратні точкизупинки та регістри процесора
- Час та латентність: перевіряється час на виконання інструкцій
Налагодження може бути перешкодою при використанні одного або кількох вищезазначених методів. Є багато методів антиналагодження для захисту програмного забезпечення від більшості загроз.