Debugowanie to jeden z kluczowych procesów podczas wytwarzania oprogramowania. Niestety na początku dość często zaniedbywany, z powodu nieznajomości technik oraz dostępnych narzędzi w konkretnym IDE. Dzisiaj porozmawiamy na temat kolejnych poziomów wykrywania błędów, jakie na swojej drodze znajduje każdy programista.
Skąd wzięło się debugowanie?
[Edit, dzięki Piotr] Debug lub debugging to angielskie słowo, które możemy tłumaczyć jako „odpluskwianie” lub „odrobaczanie”, nie brzmi już tak fancy no nie? 🙂 Historia tego słowa w kontekście IT jest praktycznie tak stara, jak stare są pierwsze komputery. Chodziłlo o zdanie wypowiedziane przez Grace Hooper, która natrafiła na ćmę w przekaźnikach komputera Mark II, powodując jego nieprawidłowe działanie.
I have no idea what I’m doing
Kiedy przystępujemy do nauki programowania wydaje nam się, że największą część czasu poświęcimy na pisanie kodu…niestety muszę Cię zmartwić, już na samym początku prawdopodobnie dostaniesz kilka błędów (Exceptionów), które trzeba będzie naprawić przed dalszą pracą. Ten poziom definiuje jako błądzenie po omacku. Nie czujemy do końca co się stało, gdzie szukać pomocy, błędy mówią do nas w dziwnym języku, pojawiają się jakieś cyferki…
Tutaj najważniejsza jest cierpliwość i analiza, po prostu musisz nauczyć się rozumieć co dany język chcę Ci przekazać. Jednym z przyjemniejszych języków, który stara się nam powiedzieć co poszło nie tak jest Python:
Powyżej deklarujemy zmienną x i przypisujemy do niej wartość 3. Następnie próbujemy wyświetlić zawartość tej zmiennej. Niestety na początku robimy literówkę w poleceniu print, zamiast tego używamy printd. Python podpowiada nam, że wystąpił SyntaxError, wskazuje numer linii gdzie pojawił się problem i używa znaku ^ do konkretnego wskazania miejsca. Tutaj uwaga, nie zawsze powinniśmy traktować jego podpowiedzi 1:1. Zdarza się, że błąd jest spowodowany poprzednią linią więc warto analizować wszystko wokół linii, którą wskazuje analizator.
Następnie użyliśmy konstrukcji print x i byłaby ona poprawna w Pythonie 2, jednak wersja 3 wymaga użycia nawiasów, o których Python przypomina za pomocą wiadomości SyntaxError: Missing parantheses in call to 'print’.
Popatrz wystarczy spokojnie czytać jaki problem wystąpił, z doświadczenia jednak wiem, że młodzi adepci nie skupiają uwagi na szczegółach. Moja porada – daj sobie czas i analizuj dokładnie co dany język chcę Ci powiedzieć.
Logowanie zdarzeń
Kolejny etap jest związany z wypisywaniem wartości zmiennych na ekran. Już wiemy, że coś jest nie tak, jednak ciężko jest znaleźć konkretną przyczynę problemu. Wypisujemy zatem zawartość poszczególnych zmiennych na ekran i sprawdzamy czy mają prawidłowe wartości. Jeśli coś jest niepoprawne to mamy punkt zaczepienia i sprawdzamy dlaczego tak jest poprzez analizę kodu. Logowanie zdarzeń jest bardzo pomocne podczas pracy z klientami. Za pomocą logów możemy zapisywać błędy, które powstały podczas pracy z programem do jakiegoś pliku. Jeśli ktoś narzeka na nasz soft to nie musimy zastanawiać się co poszło nie tak, wystarczy poprosić o plik z logami i przeanalizować historię błędów.
Używanie narzędzi dostępnych w IDE
Następny etap to użycie narzędzi dostępnych w IDE. Jeśli dotychczas Twój kod powstawał jedynie np. Notatniku lub podobnym edytorze warto byłoby się zastanowić nad użyciem czegoś bardziej użytecznego. Używanie prostych edytorów jest bardzo wartościowe na początku zaznajamiania się z językiem, później naturalnie będziemy potrzebować większego zestawu narzędzi. Zależnie od języka w którym programujesz może być to jeden z programów od JetBrains (InteliJ, PyCharm, PHPStorm etc.), Visual Studio, Eclipse i wiele, wiele więcej. Warto wybrać coś popularnego, ponieważ istnieje wysokie prawdopodobieństwo, że takiego samego programu będziesz używać w pracy.
Breakpoint-y
Breakpoint to informacja dla IDE, aby zatrzymać się w konkretnym miejscu podczas wykonywania programu. Najczęściej są oznaczane czerwoną kropką po lewej stronie od naszego kodu. Uwaga: aby skorzystać z trybu debugowania należy uruchomić program za pomocą przycisku robakiem/pluskwą, samo naciśnięcie ikony Play pominie nasze breakpointy!
W momencie zatrzymania wykonywania programu możemy podejrzeć wartości poszczególnych zmiennych. Wystarczy najechać myszką na zmienną (IntelliJ wyświetla wartości prostych typów również po prawej stronie).Następnie dzięki poniższym przyciskom możemy przejść step by step po każdej linii w naszym programie. Najbardziej powszechny jest przycisk Step Over, Step Into oraz Step Out. Po kolei przyciski te służą do przechodzenia linia po linii, wejścia do środka metody oraz wyjścia z metody.
Conditional breakpoints
W przypadku długich pętli oczekiwanie na odpowiednią linie kodu może chwilę potrwać. Dlatego też możemy skorzystać z instrukcji warunkowych w naszym breakpoincie. Załóżmy, że w 50 iteracji pętli coś jest nie tak, w taki przypadku warto skorzystać z takiego zapisu (aby wejść w ten tryb wystarczy kliknąć prawym przyciskiem na konkretny breakpoint):
W ten sposób breakpoint zostanie aktywowany dopiero w momencie kiedy zmienna i osiągnie wartość 50.
Immediate window / Code fragment evaluation
Kiedy jesteśmy w aktywnym trybie debugowania warto skorzystać z jeszcze jednego dodatku. Możemy przejąć kontrolę nad program i wykonać niektóre operacje bez ponownego restartowania aplikacji. Najlepiej pokazać to na przykładzie:
Używam tutaj poprzedniej zmiennej x (linia kodu z jej inicjalizacją została już wykonana), do której została przypisana wartość 20, teraz w okienku Evaluate Code Fragment sprawdzam jako będzie wartość jeżeli x pomnożę przez 20. To bardzo prosty przykład, ale w tym okienku możemy używać wszystkich dostępnych bibliotek – do dyspozycji mamy również IntelliSense (Code completion). W przypadku środowiska .NET tą samą funkcjonalność znajdziesz pod nazwą Immediate Window.
To Tyle na dziś, mam nadzieję, że ten wpis pozwoli Ci dużo szybciej rozwiązywać problemy z twoimi aplikacjami. Dodatkowo pokazane tutaj narzędzia z pewnością pozwolą Ci się lepiej zaprezentować na rozmowie kwalifikacyjnej niż zwykłe wypisywanie zmiennych do konsoli 😉 Jeśli masz jakieś inne metody debugowania zapraszam Cię do dyskusji, pamiętaj trzymam za Ciebie kciuki?