Przejdź do tematu:
Debugowanie
Przejdź do ćwiczenia:
Budowniczy
Włącz widok pełnoekranowy
Wyłącz dźwięk

Korzystasz z platformy z limitem dziennym na liczbę odpowiedzi. Aby zwiększyć limit lub uzyskać dostęp do konta z licencją, zaloguj się.

Zaloguj się
Udostępnij Pokaż wyjaśnienie do tematu
Debugowanie

Rzadko udaje się napisać za pierwszym razem kod całkowicie pozbawiony błędów. Ryzyko wystąpienia błędów zmniejsza dbałość o wysoką jakość kodu, jednak nie da się ich całkowicie uniknąć, dlatego należy aktywnie ich szukać. Błędy w kodzie są czasem określane angielskim terminem bug. Proces sprawdzania poprawności kodu nazywamy testowaniem, natomiast proces ustalania przyczyny błędu i jego usuwania debugowaniem.

Typy błędów

Rozróżniamy błędy składniowe (niepoprawny zapis programu – programu nie można uruchomić) oraz semantyczne (program wykonuje się, ale nie działa zgodnie z oczekiwaniami). Szczególnym przypadkiem błędu semantycznego jest zapętlenie (program nigdy nie kończy działania, np. dlatego, że warunek pętli nigdy nie przestaje być spełniony).

Przykłady błędów

Kilka przykładów częstych błędów semantycznych:

  • zamiana kolejności poleceń (np. kolejności skręcania i poruszania się do przodu)
  • błędna liczba powtórzeń pętli
  • błędne określenie ciała pętli (np. brak wcięcia polecenia, które ma być powtarzane)
  • zamiana pętli i instrukcji warunkowej (dopóki zamiast jeśli)
  • zamiana nierówności ostrej i nieostrej (x < y zamiast x ≤ y)
  • zamiana operatora logicznego (P i Q zamiast P lub Q)
  • zamiana kolejności porównywanych zmiennych (x < y zamiast y < x)
  • zamiana zmiennej przypisywanej i wyrażenia (x ← y zamiast y ← x)
  • zamiana zmiennych (użycie niewłaściwej zmiennej; ryzyko szczególnie duże przy nieczytelnym nazewnictwie)
  • użycie niewłaściwego typu zmiennej (łańcuch znaków “3” zamiast liczby 3)
  • błędna wartość parametru (np. nieprawidłowa liczba stopni, o jakie należy skręcić),
  • zamiana argumentów podczas wywołania funkcji (f(a, b) zamiast f(b, a))
  • zamiana wypisywania i zwracania wartości z funkcji (wypisz zamiast zwróć)

Znajomość typowych błędów pozwala podczas debugowania skupić uwagę na miejscach, w których może ukrywać się błąd.

Proces debugowania programu

Jeżeli program nie daje poprawnych wyników, uruchamiamy go krok po kroku i obserwujemy, w którym momencie odbiega od naszych oczekiwań. Jeżeli program nie tworzy wyjścia graficznego, możemy na bieżąco wypisywać wartości zmiennych albo użyć narzędzia, które umożliwia wykonywanie programu krok po kroku i obserwowanie wartości zmiennych (tzw. debugger). Fragment programu, w którym jego działanie odbiega od naszych oczekiwań, próbujemy poprawić.

Wskazówki dotyczące debugowania programów

  • Po każdej poprawce warto ponownie uruchomić program, aby sprawdzić efekt wprowadzonej zmiany.
  • Jeśli nie jest jasne, jak dokładnie poprawić kod (np. o ile stopni skręcić), pomocne może być narysowanie sobie obrazka.
  • Jeśli nie wiadomo, dlaczego w pewnym miejscu program zachowuje się w określony sposób, lepiej najpierw to zrozumieć, zanim zaczniemy wprowadzać zmiany.
  • Jeśli nie mamy pewności, co robi jakaś użyta konstrukcja języka (polecenie, operator), należy sprawdzić jej działanie w internecie i zweryfikować swoje rozumienie, wykonując prosty kod z użyciem danej konstrukcji.
  • Jeśli kod jest niepotrzebnie skomplikowany lub używa nieczytelnych nazw zmiennych, po usunięciu tych problemów (np. po zmianie nazw zmiennych) błąd może stać się oczywisty.
  • Podział programu na funkcje ułatwia szukanie błędów, ponieważ możemy testować poszczególne funkcje oddzielnie.

Fatal error: Uncaught TypeError: App\Service\PsService::getUserItemStatusByPs(): Argument #1 ($user) must be of type int, null given, called in /var/www/umiemyprogramowac.pl/webroot/src/Snippet/Exercise/ItemBasedExercise/ItemBasedExercisePlugin.php on line 66 and defined in /var/www/umiemyprogramowac.pl/webroot/src/Service/PsService.php:69 Stack trace: #0 /var/www/umiemyprogramowac.pl/webroot/src/Snippet/Exercise/ItemBasedExercise/ItemBasedExercisePlugin.php(66): App\Service\PsService->getUserItemStatusByPs() #1 [internal function]: App\Snippet\Exercise\ItemBasedExercise\ItemBasedExercisePlugin->progress() #2 /var/www/umiemyprogramowac.pl/webroot/src/Helper/ExerciseHeaderBuilder.php(20): call_user_func() #3 /var/www/umiemyprogramowac.pl/webroot/src/Template/BaseExercise/default.php(26): App\Helper\ExerciseHeaderBuilder->render() #4 /var/www/umiemyprogramowac.pl/webroot/src/Controller/BaseExercise.php(119): require('...') #5 /var/www/umiemyprogramowac.pl/webroot/exercise/stavitel.php(21): App\Controller\BaseExercise->renderDefault() #6 /var/www/umiemyprogramowac.pl/webroot/index.php(141): include('...') #7 {main} thrown in /var/www/umiemyprogramowac.pl/webroot/src/Service/PsService.php on line 69