Урок №26

Актуализация 16 март 2019 г

Видове грешки

Синтаксисгрешка възниква, когато пишете код, който не следва граматичните правила на езика C++. Например: липсващи точки и запетая, недекларирани променливи, несъответстващи скоби или фигурни скоби и др. Следната програма има няколко синтактични грешки:

За щастие, компилаторът улавя този вид грешки и ги докладва като предупреждения или грешки.

Семантична грешка възниква, когато кодът е синтактично правилен, но не прави това, което е предвидил програмистът.

Понякога това може да доведе до срив в програмата, например, ако разделите на нула:

Понякога това може да доведе до неправилни резултати:

Или изобщо направете грешното нещо:

За съжаление, компилаторът не улавя този вид грешки, защото проверява само това, което сте написали, а не какво сте възнамерявали да направите с него.

И тук на помощ идва дебъгерът.

Дебъгер (англ."debugger" ) е компютърна програма, която позволява на програмиста да контролира изпълнението на код. Например, програмист може да използва дебъгер, за да преминава през програма, като изследва стойностите на променливите в програмата една по една.

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

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

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

Стъпка (англ."stepping" ) е способността на дебъгера да изпълнява код стъпка по стъпка (ред по ред). Има три стъпкови команди:

Ще разгледаме всяка от тези команди на свой ред.

Команда "Стъпка".

Командата"Step into" изпълнява следния ред код. Ако този ред е извикване на функция, тогава Step Into отваря функцията и изпълнението скача в началото на тази функция.

Нека да разгледаме една много проста програма:

Както вече знаете, когато една програма стартира, изпълнението започва с извикване на основната функция main(). Тъй като искаме да извършим отстраняване на грешки вътре в main(), нека започнем с помощта на командата "Step Into".

В Visual Studio отидете на менюто Debug > „Влезте“ (или натиснете F11):

Step

Ако използвате друга IDE, намерете командата "Step Into" в менюто и я изберете.

Когато направите това, трябва да се случат две неща. Първо, тъй като нашето приложение е конзолна програма, трябва да се отвори конзолен прозорец. Тя ще бъде празна, тъй като все още не сме отпечатали нищо. Второ, трябва да видите специален маркер вляво, до отварящата скоба на функцията main(). Във Visual Studio този маркер е жълта стрелка (ако използвате друга IDE, трябва да се появи нещо подобно):

грешки

Стрелката на маркера сочи към следващия ред, който трябва да бъде изпълнен. В такъв случайдебъгерът ни казва, че следващият ред, който ще бъде изпълнен, ще бъде отварящата фигурна скоба на функцията main(). Изберете отново „Влезте“ - стрелката ще се премести на следващия ред:

printValue

Това означава, че следващият ред, който ще бъде изпълнен, ще бъде извикването на функцията printValue(). Изберете отново Step Into. Тъй като printValue() е извикване на функция, ще преминем към началото на функцията printValue():

грешки

Изберете „Step Into“ отново, за да изпълните отварящата къдрава скоба printValue(). Стрелката ще сочи към std::cout.

Сега изберете "Стъпка по разходка" (F10). Ще видите числото 5 в прозореца на конзолата.

Изберете Стъпка в отново, за да изпълните затварящата фигурна скоба printValue(). printValue() ще завърши своето изпълнение и стрелката ще се премести на main(). Имайте предвид, че в main(), стрелката отново ще сочи към printValue() извикването:

Step

Може да изглежда, че дебъгерът е на път да започне отново цикъл с функцията printValue(), но в действителност той просто ни казва, че току-що се е върнал от тази функция.

Изберете „Влезте“ два пъти. Готово, всички редове код са завършени. Някои програми за отстраняване на грешки автоматично прекратяват сесията за отстраняване на грешки в този момент. Но Visual Studio не прави това, така че ако използвате Visual Studio, изберете Debug > Спрете отстраняването на грешки (или Shift+F5):

printValue

По този начин ние напълно спряхме сесията за отстраняване на грешки на нашата програма.

Команда "Step bypass".

Подобно на командата "Step over", командата"Step over" ви позволява да изпълните следния ред код. Само ако този ред е извикване на функция, тогава "Step bypass" ще изпълни целия функционален код наведнъжнатискане и ще ни върне контрола след изпълнение на функцията.

Бележка към Code::Blocks потребители: Командата "Step over" се нарича "Next Line".

Помислете за пример с помощта на програмата по-горе: