Usuwanie błędów, inaczej debugowanie, to proces, który następuje po procesie testowania. Trzeba tutaj pamiętać że nie tylko twórcy aplikacji przeprowadzają testy, ale także klienci i użytkownicy, za każdym razem gdy używają danego programu. Sam proces debugowania polega na zlokalizowaniu błędu i jego usunięciu. Tak więc, mamy skutek, ale nie mamy przyczyny.

Schemat poszukiwania błędów, zakończony sukcesem można przedstawić za pomocą poniższego diagramu.

5 błędów

W przypadku niepowodzenia, możemy przyjąć dodatkowe hipotezy, wykonać testy potwierdzające te hipotezy i stopniowo dążyć do zlokalizowania głównej przyczyny błędu.

5 błędów 1

Identyfikacja przyczyny

Dlaczego jest to takie trudne?

Otóż często odnajdujemy przyczyny błędów za pomocą intuicji i nierzadko szczęścia. Dużą rolę odgrywają tutaj posiadane umiejętności i zdobyte doświadczenie, co przekłada się na mniejszą obawę o wyniki. Czynnik psychologiczny ma prawdopodobnie największe znaczenie, w kontekście niechęci do poprawiania błędów. Co gorsze, nie ma naukowej metody skutecznego usuwania błędów, co dodatkowo potęguje frustracje.

Jako ciekawostkę można potraktować informację nt. przeprowadzanych eksperymentów dotyczących sprawności usuwania błędów. Wskazują one na duże rozbieżności nawet w gronie tak samo wykszatałconych i doświadczonych programistów.

Skoro nie ma stuprocentowo skutecznej techniki na usunięcie błędu, jak więc maksymalnie zwiększyć swoje szanse?

Poniżej przedstawiam 5 najbardziej skutecznych narzędzi, które pomogą zlokalizować i usunąć najtrudniejsze błędy.

1. Xdebug

Jest to najbardziej zaawansowane narzędzie do debugowania dostępne dla środowiska PHP. Umożliwia pracę w trybie krokowym, jak również z wykorzystaniem tzw. pułapek (breakpoints). Używa protokołu DBGp. Ponadto oferuje możliwość profilowania oraz generowania śladu stosu (stack trace).

Xdebug pozwala na zbieranie takich informacji jak: zużycie pamięci, maksymalne zużycie pamięci, czas wykonania, wartości przekazywanych zmiennych (aplikacje typu Magento zwracają po kilkanaście GB danych w tym trybie!), wartości zwracane przez funkcje, itp. Ponadto Xdebug wpółpracuje ze wszystkimi najpopularniejszymi środowiskami IDE.

2. Xhprof

Bardzo dobre narzędzie do profilowania, stworzone przez Facebook’a i wpomagające poprawianie takich błędów, jak np. segfault. Udostępnia szczegółowe dane, nt. ilości wywołań funkcji, czasu wykonywania, zużycia pamięci, szczytowego zużycia pamięci i wykorzystania procesora.

Dodatkowo wartości typu „inclusive” zawierają dane zbiorcze dla danej funkcji oraz wszystkich funkcji zależnych, które dana funkcja wywołuje. „Exclusive” natomiast dostarcza dane tylko dla danej funkcji (bez uwzględniania wywołań funkcji zależnych). Ciekawostką jest również generowanie grafu zależności, na którym na czerwono zaznaczone są najwolniejsze funkcje oraz możliwość porównania dwóch różnych raportów profilowania.

Do zbierania i obrazowania wyników można wykorzystać Xhgui i bazę danych MongoDB.

3. Monolog

W przypadku, gdy nie jesteśmy w stanie odtworzyć błędu, konieczne jest zebranie dodatkowych informacji. Tutaj możemy skorzystać z tak zwanych loggerów. Jednym z najlepszych jest Monolog. Pozwala on na stopniowanie rejestrowanych logów (DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY), wysyłanie alertów i emaili (HipChat, Flowdock, Slack, Fleep, itp.), logowanie danych do bazy (Redis, MongoDB, CouchDB, ElasticSearch, DynamoDb), formatowanie danych (Line, Html, Json, Elastica, Flowdock, MongoDB), i wiele innych ciekawych możliwości.

4. PHP Debug Bar

PHP Debug Bar do narzędzie do szybkiego podglądu działania aplikacji. Zbiera i udostępnia takie dane jak: użycie pamięci, czas żądania, zarejestrowane wiadomości, dane w tablicach superglobalnych ($_GET, $_POST, $_REQUEST, $_SERVER), timeline, zgłoszone wyjątki, zapytania do bazy danych. Zawiera także wsparcie dla Laravel, Atomik, XOOPS i Zend Framework 2 oraz kolektory dla: PDO, CacheCache, Doctrine, Monolog, Propel, Slim, Swift Mailer i Twig. Dostępne w Magento Developer Toolbar.

5. Strace

Narzędzie, które umożliwia badanie aplikacji na bardzo niskim poziomie (interakcja programu z jądrem systemu Linux). Rejestruje wywołania systemowe oraz sygnały i zmiany stanu procesu. Umożliwia też zliczanie i mierzenie czasu poszczególnych wywołań. Strace przydatny jest w przypadku, gdy mamy nagłe załamanie działania programu, w którym inne narzędzia nie są w stanie zebrać danych.

Wymaga podstawowej wiedzy nt. wywołań systemowych.

Skrypt można uruchomić bezpośrednio pod kontrolą Strace lub wykorzystać Strace do zbadania już uruchomionego procesu.

Jeżeli interesujesz się tematem polecam książkę: Praktyczne podejście do inżynierii oprogramowania, Roger S. Pressman

Chcesz wiedzieć, jak radzić sobie z najtrudniejszymi błędami w PHP w Twoim e-biznesie? Napisz do nas!