Отстраняване на грешки, настройки на програмата - Life-Prog

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

Терминология

Има известни разногласия относно произхода на термина английски. отстраняване на грешки.

Твърди се, че термините "бъг" и "дебъгване" са възприети за първи път от Грейс Гопър през 40-те години на миналия век. Когато тя работеше върху компютър Mark II в Харвардския университет, служителите й откриха, че бенка е заседнала в реле и по този начин пречи на действията на компютъра, след което тя отбеляза, че те правят английски. дебъг (от английски bug - буболечка, насекомо) системи. Въпреки това, терминът "бъг" в смисъла на техническа грешка е бил използван поне още през 1878 г. от Томас Едисон, а "дебъгване" изглежда е бил използван като термин в аеронавтиката преди появата на компютрите.

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

Като цяло езици за програмиране на високо нивонива, като Java, които улесняват отстраняването на грешки, тъй като имат специални функции, като обработка на изключения, които ви позволяват бързо да намерите източника на повредата. В езиците за програмиране на ниско ниво, като асемблер, е по-вероятно дефектите да създадат латентни проблеми, като повреда на паметта, и са много по-трудни за откриване, тъй като ефектът от проблема може да се появи много по-късно след активирането на дефекта и формата на проблема може да бъде доста различна. В такива случаи специалните програми като дебъгер на паметта са изключително полезни.

В някои ситуации инструментите с общо предназначение, които са специфични за езика, могат да бъдат много полезни. Пример за това са инструментите за статичен анализ на код. Тези инструменти търсят много специфични известни (чести и редки) проблеми в необработения код. Проблеми, идентифицирани от тези инструменти, рядко се съобщават от компилатора или преводача, тъй като тези проблеми не са на синтактично ниво, а на семантично ниво. Някои производители на такива инструменти твърдят, че техните програми могат да открият над 300 уникални проблема. Такива инструменти могат да бъдат изключително полезни при проверка на много големи количества необработен код, където е много неефективно да се преглежда целият код или да се проследяват всички пътища на неговото изпълнение. Типичен пример за идентифициран проблем би бил достъпът до променлива, преди нейната стойност да е зададена. Друг пример би била по-строга проверка на типа, ако речта няма такава. По този начин тези средства за защита са най-добрите за идентифициране на възможни недостатъци, за разлика от действителните недостатъци. В резултат на това тези инструменти имат висок процент на фалшиви положителни резултати. Древната помощна програма Unix Lint е една отнай-старите образци на този тип съоръжения.

За отстраняване на грешки в електронни устройства (например компютърен хардуер), както и софтуер от ниско ниво (BIOS, драйвери на устройства и т.н.) и фърмуер се използват инструменти като осцилоскоп, логически анализатор, ICE, POST контролер, често използвани в комбинация. Те могат да изпълняват много типични действия за отстраняване на грешки на софтуера на фърмуера.

Процес на отстраняване на грешки

Отстраняването на грешки при печат е акт на наблюдение (на живо или на запис) на действията при печат, показващи напредъка на процеса.

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

След като грешките бъдат възпроизведени, е необходимо да се опрости въвеждането на програмата, за да се улесни процеса на отстраняване на грешки. Така, например, грешка в компилатора може да причини срив при обработка на голям необработен код. Но след опростяване на сценариите за възпроизвеждане на проблема, само няколко реда изходни кодове може да са достатъчни за възпроизвеждане на срива. Това опростяване може да се направи ръчно, като се използва подходът „разделяй и владей“. Програмистът се опитва да премахне някои части от оригиналния тест и да провери дали проблемът все още съществува. Когато отстранява грешки в GUI, програмистът ще се опита да пропусне някои потребителски взаимодействия с оригиналното описание на проблема и ще провери дали други действия са достатъчни за идентифициране на недостатъци. За автоматизиране на опростяването на тестаможе да се използва делта отстраняване на грешки.

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

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

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

Анти-дебъгери

Анти-дебъгването е "имплементирането на един или повече методи в компютърен код, който пречи на опитите за обратно проектиране и отстраняване на грешки в целевия процес". Видове подходи:

  • Базиран на API: проверете за програми за отстраняване на грешки, като използвате системна информация
  • Въз основа на изключения: проверява дали са уловени изключения
  • Блокиране на процеси и нишки: проверява се дали е имало манипулации с блокирането на процес или нишки
  • Промяна на кода: проверява дали има промени в кода, направени от програмите за отстраняване на грешки, за да се култивират точки на прекъсване на програмата
  • Въз основа на хардуер и регистри: хардуерните точки се проверяватточки на прекъсване и регистри на процесора
  • Време и латентност: проверява се времето за изпълнение на инструкциите

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