3.2 — Proces debugowania

Załóżmy, że napisałeś program, który nie działa poprawnie — kod kompiluje się poprawnie, ale po uruchomieniu pojawia się nieprawidłowy wynik. Musisz mieć gdzieś błąd semantyczny. Jak możesz to znaleźć? Jeśli postępujesz zgodnie z najlepszymi praktykami, pisząc kawałek kodu, a następnie go testując, być może masz dobre pojęcie, gdzie leży błąd. Możesz też nie mieć o tym zielonego pojęcia.

Wszystkie błędy wynikają z prostego założenia: coś, co uważałeś za prawidłowe, wcale takie nie jest. Właściwie ustalenie, gdzie jest ten błąd, może być trudne. Podczas tej lekcji przedstawimy ogólny proces debugowania programu.

Ponieważ nie omówiliśmy jeszcze zbyt wielu tematów dotyczących C++, nasze przykładowe programy w tym rozdziale będą dość proste. To może sprawić, że niektóre z pokazanych tutaj technik będą wydawać się przesadne. Należy jednak pamiętać, że te techniki są przeznaczone do stosowania z większymi, bardziej złożonymi programami i będą bardziej przydatne w takim ustawieniu (czyli tam, gdzie są najbardziej potrzebne).

Ogólne podejście do debugowania

Po zidentyfikowaniu problemu jego debugowanie składa się zazwyczaj z sześciu kroków:

  1. Znajdź pierwotną przyczynę problemu (zwykle jest to niedziałający wiersz kodu). Na następnej lekcji omówimy pewne strategie, jak to zrobić.
  2. Upewnij się, że rozumiesz, dlaczego występuje problem.
  3. Określ, w jaki sposób możesz rozwiązać problem.
  4. Napraw problem powodujący problem.
  5. Przetestuj ponownie, aby upewnić się, że problem został rozwiązany.
  6. Przetestuj ponownie, aby upewnić się, że nie pojawiły się nowe problemy się pojawiło.

Posłużmy się tutaj analogią z życia wziętą. Załóżmy, że pewnego wieczoru idziesz po lód z dozownika lodu w zamrażarce. Przystawiasz kubek do dozownika, naciskasz dźwignię i… nic nie wypływa. Uch, och. Odkryłeś jakąś wadę. Co byś zrobił? Prawdopodobnie rozpocząłbyś dochodzenie, aby sprawdzić, czy możesz zidentyfikować pierwotną przyczynę problemu.

Znajdź główną przyczynę: Skoro słyszysz, jak dozownik lodu próbuje dostarczyć lód, prawdopodobnie nie jest to sam mechanizm dostarczania lodu. Otwierasz więc zamrażarkę i sprawdzasz tackę na lód. Żadnego lodu. Czy to jest główna przyczyna problemu? Nie, to kolejny objaw. Po dalszym badaniu stwierdzasz, że kostkarka do lodu nie wytwarza lodu. Czy problemem jest kostkarka do lodu, czy coś innego? Zamrażarka jest nadal zimna, przewód doprowadzający wodę nie jest zatkany i wszystko inne wydaje się działać, więc wnioskujesz, że podstawową przyczyną jest niesprawność kostkarki do lodu.

Zrozum problem: W tym przypadku jest to proste. Zepsuta kostkarka do lodu nie będzie wytwarzać lodu.

Wyznacz rozwiązanie: W tym momencie masz kilka możliwości rozwiązania problemu: Możesz obejść problem (kup worki lodu w sklepie). Możesz spróbować dalej zdiagnozować kostkarkę, aby sprawdzić, czy istnieje część, którą można naprawić. Można kupić nową kostkarkę do lodu i zainstalować ją w miejsce obecnej. Albo możesz kupić nową zamrażarkę. Decydujesz się na zakup nowej kostkarki do lodu.

Napraw problem: Gdy kostkarka do lodu zostanie dostarczona, zainstaluj ją.

Testuj ponownie: Po ponownym włączeniu prądu i odczekaniu nocy Twoja nowa kostkarka zaczyna wytwarzać lód. Nie wykryto żadnych nowych problemów.

Zastosujmy teraz ten proces do naszego prostego programu z poprzedniej lekcji:

#include <iostream>

int add(int x, int y) // this function is supposed to perform addition
{
    return x - y; // but it doesn't due to the wrong operator being used
}

int main()
{
    std::cout << "5 + 3 = " << add(5, 3) << '\n'; // should produce 8, but produces 2

    return 0;
}

Ten kod jest dobry pod jednym względem: błąd jest bardzo widoczny, ponieważ zła odpowiedź jest wyświetlana na ekranie w linii 10. To daje nam punkt wyjścia do naszego dochodzenia.

Znajdź główną przyczynę: W linii 10 widzimy, że jesteśmy przekazując literały dla argumentów (5 i 3), więc nie ma tam miejsca na błędy. Ponieważ wejścia działają add są poprawne, ale wynik nie jest, jest całkiem oczywiste, że funkcja add musi generować niewłaściwą wartość. Jedyną instrukcją w funkcji add jest instrukcja return, która musi być przyczyną. Znaleźliśmy problematyczną linię. Teraz, gdy wiemy, na czym skupić naszą uwagę, podczas inspekcji prawdopodobnie zauważysz, że odejmujemy, a nie dodajemy.

Zrozum problem: W tym przypadku jest oczywiste, dlaczego generowana jest niewłaściwa wartość — używamy złego operatora.

Wyznacz rozwiązanie: Po prostu zmień operator- Do operator+.

Napraw problem: To właściwie zmienia operator- Do operator+ i upewnij się, że program się rekompiluje.

Testuj ponownie: Po wdrożeniu zmiany, ponowne uruchomienie programu wskaże, że nasz program wygenerował teraz poprawną wartość 8. W przypadku tego prostego programu to wszystkie potrzebne testy.

Ten przykład jest trywialny, ale ilustruje podstawowy proces, przez który należy przejść podczas diagnozowania dowolnego programu.

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
67 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze