Przegląd rozdziału
A składnią błąd to błąd pojawiający się podczas pisania instrukcji niezgodnej z gramatyką języka C++. Kompilator je wyłapie.
A Błąd semantyczny występuje, gdy instrukcja jest poprawna składniowo, ale nie robi tego, co zamierzył programista.
Proces znajdowania i usuwania błędów z programu nazywa się debugowaniem.
Możemy zastosować pięcioetapowy proces, aby podejść do debugowania:
- Znajdź katalog główny przyczyna.
- Zrozum problem.
- Wyznacz rozwiązanie.
- Napraw problem.
- Przetestuj ponownie.
Znalezienie błędu jest zwykle najtrudniejszą częścią debugowania.
Narzędzia do analizy statycznej to narzędzia analizujące kod i szukające problemów semantycznych co może wskazywać na problemy z kodem.
Możliwość niezawodnego odtworzenia problemu to pierwszy i najważniejszy krok debugowania.
Istnieje wiele taktyk, które możemy zastosować, aby pomóc w wyszukiwaniu problemów:
- Komentowanie kodu.
- Używanie instrukcji wyjściowych do sprawdzania poprawności przepływu kodu.
- Drukowanie wartości.
Jeśli do debugowania używasz instrukcji print, użyj std::cerr zamiast std::cout. Ale jeszcze lepiej, unikaj debugowania za pomocą instrukcji print.
A plik dziennika to plik rejestrujący zdarzenia występujące w programie. Proces zapisywania informacji w pliku dziennika nazywa się logowaniem.
Proces restrukturyzacji kodu bez zmiany jego zachowania nazywa się refaktoryzacją. Zwykle robi się to, aby uczynić program bardziej zorganizowanym, modułowym i wydajnym.
Testowanie jednostkowe to metoda testowania oprogramowania, za pomocą której testowane są małe jednostki kodu źródłowego w celu ustalenia, czy są one poprawne.
Programowanie defensywne to technika, dzięki której programista stara się przewidzieć wszystkie sposoby niewłaściwego użycia oprogramowania. Te nadużycia często można wykryć i złagodzić.
Wszystkie informacje śledzone w programie (wartości zmiennych, jakie funkcje zostały wywołane, bieżący punkt wykonania) są częścią stanu programu.
A debugera to narzędzie, które pozwala programiście kontrolować sposób wykonywania programu i badać jego stan podczas działania. zintegrowany debugger to debuger integrujący się z edytorem kodu.
Stepping to nazwa zestawu powiązanych funkcji debugowania, które pozwalają przechodzić przez kod instrukcja po instrukcji.
Krok w wykonuje następną instrukcję w normalnej ścieżce wykonywania programu, a następnie wstrzymuje wykonywanie. Jeśli instrukcja zawiera wywołanie funkcji, step in powoduje przeskoczenie programu na początek wywoływanej funkcji.
Step over wykonuje następną instrukcję w normalnej ścieżce wykonywania programu, a następnie wstrzymuje wykonywanie. Jeśli instrukcja zawiera wywołanie funkcji, przekroczenie wykonuje funkcję i zwraca kontrolę po wykonaniu funkcji.
Step out wykonuje cały pozostały kod aktualnie wykonywanej funkcji, a następnie zwraca kontrolę po powrocie funkcji.
Uruchom do kursora wykonuje programu, aż wykonanie osiągnie instrukcję wybraną kursorem myszy.
Continue uruchamia program do zakończenia programu lub trafienia punktu przerwania. Start jest taki sam jak kontynuowanie, tylko od początku programu.
A punkt przerwania to specjalny znacznik, który mówi debuggerowi, aby przerwał wykonywanie programu po osiągnięciu punktu przerwania. Polecenie
Klasa set next instrukcja pozwala nam zmienić punkt wykonania na inną instrukcję (czasami nieformalnie nazywaną przeskakiwaniem). Można tego użyć do przeskoczenia punktu wykonania do przodu i pominięcia części kodu, który w przeciwnym razie zostałby wykonany, lub do tyłu i ponownego uruchomienia czegoś, co zostało już wykonane.
Obserwowanie zmiennej pozwala sprawdzić wartość zmiennej podczas wykonywania programu w trybie debugowania. Okno podglądu pozwala sprawdzić wartość zmiennych lub wyrażeń.
Klasa stos wywołań to lista wszystkich aktywnych funkcji, które zostały wykonane, aby dotrzeć do bieżącego punktu wykonania. Okno stosu wywołań to okno debugera pokazujące stos wywołań.
Czas quizu
Pytanie nr 1
Następujący program powinien dodać dwie liczby, ale nie działa poprawnie.
Użyj zintegrowanego debugera, aby przejść przez ten program i obserwować wartość x. Na podstawie zdobytych informacji napraw następujący program:
#include <iostream>
int readNumber(int x)
{
std::cout << "Please enter a number: ";
std::cin >> x;
return x;
}
void writeAnswer(int x)
{
std::cout << "The sum is: " << x << '\n';
}
int main()
{
int x {};
readNumber(x);
x = x + readNumber(x);
writeAnswer(x);
return 0;
}Pytanie nr 2
Następujący program ma dzielić dwie liczby, ale nie działa poprawnie.
Użyj zintegrowanego debugera, aby przejść przez ten program. Dla danych wejściowych wprowadź 8 i 4. Na podstawie zdobytych informacji napraw następujący program:
#include <iostream>
int readNumber()
{
std::cout << "Please enter a number: ";
int x {};
std::cin >> x;
return x;
}
void writeAnswer(int x)
{
std::cout << "The quotient is: " << x << '\n';
}
int main()
{
int x{ };
int y{ };
x = readNumber();
x = readNumber();
writeAnswer(x/y);
return 0;
}Pytanie nr 3
Jak wygląda stos wywołań w poniższym programie, gdy punkt wykonania znajduje się w linii 4? W tym ćwiczeniu potrzebne są tylko nazwy funkcji, a nie numery linii wskazujące punkt powrotu.
O stosie wywołań mówimy na lekcji 3.9 — Korzystanie ze zintegrowanego debugera: Stos wywołań.
#include <iostream>
void d()
{ // here
}
void c()
{
}
void b()
{
c();
d();
}
void a()
{
b();
}
int main()
{
a();
return 0;
}Pytanie nr 4
Dodatkowe zaliczenie: Poniższy program powinien dodać dwie liczby, ale nie działa poprawnie.
Użyj zintegrowanego debugera, aby przejść przez ten program. Dla danych wejściowych wprowadź 8 i 4. Na podstawie zdobytych informacji napraw następujący program:
#include <iostream>
int readNumber()
{
std::cout << "Please enter a number: ";
char x{};
std::cin >> x;
return x;
}
void writeAnswer(int x)
{
std::cout << "The sum is: " << x << '\n';
}
int main()
{
int x { readNumber() };
int y { readNumber() };
writeAnswer(x + y);
return 0;
}Nota autora
Trudno znaleźć dobre przykłady prostych programów, które mają nieoczywiste problemy do debugowania, biorąc pod uwagę ograniczoną dotychczas ilość materiału. Czy czytelnicy mają jakieś sugestie?

