Debugowanie
Budowniczy
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ę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ókizamiastjeśli) - zamiana nierówności ostrej i nieostrej (
x < yzamiastx ≤ y) - zamiana operatora logicznego (
P i QzamiastP lub Q) - zamiana kolejności porównywanych zmiennych (
x < yzamiasty < x) - zamiana zmiennej przypisywanej i wyrażenia (
x ← yzamiasty ← 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 liczby3) - 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)zamiastf(b, a)) - zamiana wypisywania i zwracania wartości z funkcji (
wypiszzamiastzwróć)
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