Различните начини на работа на дебъгерите

За всеки софтуерен проект отстраняването на грешки се счита за важна, но взискателна задача. Разработчиците трябва да влязат в непрекъснат цикъл на тестване, отстраняване на грешки и внедряване, за да се уверят, че техният продукт е актуален и функционира правилно във всички целеви платформи.

Обикновено процесът протича по следния начин: след като разработчиците финализират кодовата база на програмата за продукт, тази кодова база се изпраща на тестер. Тестерите изпълняват кодовата база срещу добре дефинирани входни тестове, за да проверят дали програмата дава очакваните резултати. По време на тестването тестерите наблюдават връзката между входа и изхода на програмата. Ако един от тестовите случаи даде грешни резултати, тестът съобщава това обратно на първоначалните разработчици.

Неизправност на програмата означава, че кодовата база съдържа грешка, но това не ни дава допълнителна информация за местоположението на тази грешка. С други думи, тестването разкрива наличиетои ефектите от грешките, а не причината за грешките. След това разработчиците трябва да преминат през процес на отстраняване на грешки, за да идентифицират причините и да коригират грешките, които ги причиняват.

Въпреки че няма фиксирана процедура за коригиране на всички грешки, има няколко техники, които могат да намалят усилията ви за отстраняване на грешки. Значителна (ако не и цялата) част от този процес се изразходва за намиране на местоположението на грешката.

В тази статия ще обсъдим трите най-известни и използвани техники:

  • Отстраняване на грешки, базирано на проследяване
  • Отстраняване на грешки на базата на спектър
  • Delta отстраняване на грешки

Различните техники са по-подходящи за различни случаи. Няма точен най-добър метод. Всичко зависи от типа кодова база, която тествате, и вашите предпочитания. Независимо от това, за разработчиците е подходящо да имат познания и опит с всички тези подходи. Понякога комбинация от един или повече от тези подходи ще ви отведе до местоположението на грешката.

И така, нека да започнем отстраняването на грешки.

Отстраняване на грешки, базирано на проследяване

Отстраняването на грешки, базирано на проследяване, е традиционно и най-разпространената техника за отстраняване на грешки, използвана в повечето инструменти за отстраняване на грешки днес. Отстраняването на грешки, базирано на проследяване, се основава на концепцията за точки на прекъсване.

Точката на прекъсване е точка на пауза или спиране, добавена към програмата, за да се провери състоянието на изпълнение на програмата до тази точка. След коригиране на текущия бъг, разработчикът обикновено задава следващата точка на прекъсване и повтаря същия процес, докато всички бъгове бъдат коригирани.

Базираното на проследяване отстраняване на грешки има четири подтехники

  1. Проследяване на грешки (TD)
  2. Всезнаещо отстраняване на грешки (OD)
  3. Алгоритмично отстраняване на грешки (AD)
  4. Хибридно отстраняване на грешки (HD)

Всички тези подтехники се основават на една и съща концепция: програмно нарязване.

Нарязване

Нарязването на програмата е техника, използвана в компютърните науки за опростяване на големи програми чрез фокусиране върху по-малка, избрана част от тях. Процесът на нарязване изтрива части от програмата, които нямат или имат малък ефект върху аспекта, който се тества, или цялостния изход на програмата. През 1981 г. Марк Уайзър, компютърен учен и главен технологичен директор в Xerox PARC, дефинира програмен фрагмент като:

„Мисловната абстракция, която хората правят, когато отстраняват грешки в програма.“

Срязването на програмата се използва в много приложения в компютърните науки:

  1. Отстраняване на грешки.
  2. Обратно проектиране на програма.
  3. Измерване на покритието, припокриването или групирането на програма.
  4. За по-задълбочено разбиране на вътрешната работа на дадена програма.

Има няколко възможни подхода за нарязване на програма, като статично нарязване, динамично нарязване, условно нарязване и аморфно нарязване.

  • Статично нарязване:Стичните срезове се конструират за подмножество от променливите на програмата без каквито и да било предположения относно входа на програмата. След като изберем набор от променливи на срез, можем да конструираме един от двата типа срезове: срез назад или срезнапред. Назадсрезът съдържа секциите на програмата, които биха могли да повлияят на променливите на среза, докато предниятсрез съдържа тези секции, които са засегнатиот среза на променливи.
  • Динамично нарязване: Динамичните нарязвания се формират въз основа на набора от променливи и точката в кода, която искаме да проверим в допълнение към последователността от входни стойности, за които програмата е произвела грешка. Тази информация се нарича критерий за динамично нарязване.

  • Условно нарязване: При статично нарязване не предоставяме нищоза входа. При динамично нарязване ние го конструираме въз основа на конкретенвход. Условното нарязване е някъде по средата. В условен срез можем да предоставим информацияна инструмента за срязване относно входа, безда сме толкова специфични относно точните стойности.
  • Аморфно нарязване: Всички предишни нарязвания, обсъждани досега, представляват запазване на синтаксиса. Тези подходи са изградени чрез изтриване на твърденията, които не засягат набора от въпросните променливи. Въпреки това, аморфните срезове се конструират с помощта на всяка програмна трансформация, което опростява програмата, като същевременно запазва функционалността на цялостната програма.

Сред тези четири типа динамичното нарязване е най-използваната техника при отстраняване на грешки. Това е така, защото когато отстраняваме грешки, имаме конкретен тестов случай, който е довел до грешката, така че можем да използваме този тестов случай като вход за конструиране на нашите срезове.

Проследяване на грешки

При проследяване на грешки (TD) дебъгерът може да зададе точка на прекъсване и когато точката на прекъсване бъде достигната по време на изпълнение на програмата, програмата се спира. След това програмистът може да провери състоянието на програмата, като я изпълнява ред по ред. Дебъгерът поема контрола само върху интерпретатора и следователно мащабируемостта на TD е същата като тази на интерпретатора. По време на процеса на намиране на местоположението на грешка, ако бъде намерена грешка преди точката на прекъсване, тогава процесът на отстраняване на грешки трябва да се рестартира, за да я хване.

Всезнаещо отстраняване на грешки

При всезнаещото отстраняване на грешки (OD), известно още като отстраняване на грешки назад във времето, дебъгерът може да проследи изчисленията на програмата както назад, така и напред. При този тип отстраняване на грешки следите за изпълнение са огромни и съхраняването им е предизвикателна задача, така че мащабируемостта на OD е доста трудна.

Алгоритмично отстраняване на грешки

Алгоритмичното отстраняване на грешки (AD) е полуавтоматична техника за отстраняване на грешки, която създава диалог между дебъгера и разработчика за намиране на грешки. Така че няма нужда да виждате кода, за да извършите действителното отстраняване на грешки. Ето защо нивото на абстракция на AD е високо. AD се извършва на две фази: Първо, изгражда дървото за изпълнение на дадената програма. След това създаденото дърво на изпълнение се изследва в пълни подробности.

Хибридно отстраняване на грешки

Хибридното отстраняване на грешки (HD) е техника за отстраняване на грешки, която съчетава отстраняване на грешки чрез проследяване, всезнаещо отстраняване на грешки и алгоритмично отстраняване на грешки. Първо, той използва проследяване на грешки, за да открие частта от програмата, където възниква грешката. След това използва алгоритмично отстраняване на грешки само в тази част от програмата и създава нейното дърво за изпълнение. След това прилага всезнаещо отстраняване на грешки към един метод, където алгоритмичното отстраняване на грешки идентифицира грешка.

Отстраняване на грешки на базата на спектър

При отстраняване на грешки на базата на спектъра, известно още като локализиране на грешки на базата на спектъра (SFL), процесът на отстраняване на грешки се извършва чрез наблюдение на изразите, включени в конкретно дърво за изпълнение. Това се постига чрез използване на програмния спектър за идентифициране на активната част от програмата по време на нейното изпълнение. Програмният спектър еколекция от информация за времето на изпълнениекоято дава представа за динамичното поведение на програмата. Той включва някои флагове, съответстващи на различни части на програмата. Съществуват различни видове програмни спектри, като block hit/miss и function hit/miss. Тези спектри се използват за определяне на точните секции от кода, работещ за конкретен или абстрактен вход.

Делта отстраняване на грешки

Процесът на делта отстраняване на грешки (DD) е да минимизира автоматизираните тестови случаи. Той взема тестови случаи, които могат да причинят грешката, и изготвя доклад за грешка. От този отчет за грешка се избиратминимални тестови случаи въз основа на тяхната висока вероятност да доведат до грешката. Минималните тестови случаи ще генерират повторно същата грешка и по този начин ще помогнат на разработчика да открие грешката зад нея.

Заключение

Има редица други стратегии, които могат да се използват, за да помогнат на разработчика да открие грешки, съществуващи в кода. Като разработчик винаги си напомням за няколко неща:

  • Грешката може да не е там, където я търсите.Понякога, когато разработчикът търси грешка, той прекарва дълго време в проверка на конкретен раздел от кода, само за да разбере, че грешката е другаде .
  • Разглеждането на проблема от друг ъгъл дава различна гледна точка. И като посочим частите от кода, които са без грешки, можем да разкрием къде всъщност е грешката.
  • Проверете входните данни и подробностите за теста.Понякога тестът може да е повреден. Така че винаги е добра идея да преминете през него и да се уверите, че всичко е наред.

Всичко по-горе са техники, използвани за локализиране на грешки, но след това какво?

След като бъде идентифицирана грешка, грешките трябва да бъдат коригирани. В някои случаи това може да е тривиално. В други случаи това ще бъде просто. Разработчиците трябва да обмислят добре как конкретна корекция ще се отрази на останалата част от кода. Те трябва да гарантират, че поправката няма да доведе до счупване на други части на кода. Бъговете, които представляват концептуални грешки в кода, без съмнение са най-трудните за коригиране. Ето защо разработчиците трябва да преосмислят не само корекцията, но и логиката на програмата.

Това е втората статия от поредица, обсъждаща всичко относно отстраняването на грешки и програмите за отстраняване на грешки. Първата статия беше:

  • „Всичко за отстраняването на грешки: Въведение“. Той даде общ преглед на отстраняването на грешки, защо е важен инструмент/умение на разработчиците на софтуер и разликата между отстраняване на грешки и тестване.

Предстоящите статии ще бъдат:

  • Всичко за отстраняването на грешки: специални системи. Ще обсъдя отстраняването на грешки в специални системи като широкомащабно отстраняване на грешки, паралелно отстраняване на грешки и други.
  • Всичко за отстраняването на грешки: Разширени подходи.Ще обсъдя въпроси без отговор относно програмите за отстраняване на грешки, визуалните програми за отстраняване на грешки и най-новите изследвания за отстраняване на грешки.

Препратки

  1. B. Korel, J. Rilling, Прилагане на динамично нарязване при отстраняване на грешки в програмата.
  2. G. Pothier, E. Tanter, J. Piquer, Мащабируемо всезнаещо отстраняване на грешки.
  3. P. Fritzson, Обобщено алгоритмично отстраняване на грешки и тестване.
  4. J. Gonzlez, D. Insa, J. Silva, Нова хибридна архитектура за отстраняване на грешки за eclipse.
  5. G. Mariga, K. Mwiti, Подходи за автоматично отстраняване на грешки: преглед на литературата.