Jak debugować kod skutecznie?

Cześć! 😊

Debugowanie to jedna z tych rzeczy, które każdy programista zna aż za dobrze – po prostu nie ma od niego ucieczki! Czasami kod działa świetnie, a innym razem wszystko się sypie. Wiesz, jak to jest: masz kod, który wygląda idealnie, a potem uruchamiasz go i… coś nie działa. Wtedy debugowanie staje się Twoim najlepszym przyjacielem. Dziś pokażę Ci kilka prostych trików, które pomogą Ci debugować skutecznie. Będziemy pracować w PHP, ale zasady są uniwersalne, więc jeśli zmienisz język, będziesz wiedział, jak podejść do problemu.

Zacznij od raportowania błędów i logów!

Pierwszym krokiem jest sprawdzenie, co mówi Ci system. W PHP nie musisz się martwić, że coś umknie, bo istnieje mnóstwo narzędzi, które pomogą Ci znaleźć problem.

Jeśli podejrzewasz, że coś w Twoim kodzie nie działa, najpierw sprawdź komunikaty błędów. Włącz je, jeśli jeszcze tego nie zrobiłeś. Możesz to zrobić w pliku konfiguracyjnym php.ini:

display_errors = On
error_reporting = E_ALL

Jeśli pracujesz lokalnie, możesz po prostu włączyć wyświetlanie błędów bezpośrednio w skrypcie:

ini_set('display_errors', 1);
error_reporting(E_ALL);
💡
Dzięki temu od razu zobaczysz komunikaty błędów. Może to być literówka, nieznana zmienna lub brakująca funkcja. Jeśli masz problem z połączeniem z bazą danych, te komunikaty będą nieocenione.

Biała strona – brak komunikatu błędu

Czasami zdarza się, że zamiast komunikatu o błędzie, skrypt PHP po prostu wyświetla pustą stronę. Jest to najczęściej efekt zbyt niskiego poziomu raportowania błędów w konfiguracji serwera lub samego skryptu.

🎯
W tym wypadku należy włączyć pełne raportowanie błędów error_reporting(E_ALL);
💡
Można również sprawdzić logi serwera, aby znaleźć szczegóły błędu.

Więcej na temat komunikatów błędów znajdziesz w osobnym wpisie pt. Jak interpretować komunikaty błędów?

Dodaj var_dump() i print_r()

Często najlepszym przyjacielem programisty są funkcje var_dump() i print_r(). Choć proste, są niesamowicie skuteczne. Jak to działa? Zamiast zgadywać, co jest w zmiennej, po prostu ją „wypisz”:

$array = [1, 2, 3, 4];
var_dump($array);

Wynik:

    array(4) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
      [3]=>
      int(4)
    }
💡
Dzięki temu dowiesz się dokładnie, co znajduje się w zmiennej – ile ma elementów, jaki typ danych, co jest w środku. Jeśli masz problem z danymi pobranymi z bazy danych, użyj var_dump($result), aby zobaczyć, co dokładnie wróciło z zapytania.

Przykład: Załóżmy, że masz formularz i próbujesz pobrać dane użytkownika z bazy, ale nic się nie wyświetla. Użyj tego:

$query = "SELECT * FROM users WHERE id = 1";
$result = mysqli_query($conn, $query);
var_dump($result);  // Zobaczysz dokładnie, co zostało zwrócone

Sprawdzaj krok po kroku z xdebug

To już bardziej zaawansowane narzędzie, ale naprawdę warto je znać. xdebug to rozszerzenie PHP, które pozwala na śledzenie i debugowanie kodu linijka po linijce. Dzięki temu możesz:

  • Przechodzić przez kod krok po kroku.

  • Ustawiać punkty zatrzymania (tzw. „breakpoints”).

  • Sprawdzać zmienne w trakcie działania skryptu.

Jeśli chcesz zacząć korzystać z xdebug, musisz je najpierw zainstalować i skonfigurować w pliku php.ini. Kiedy to już zrobisz, wystarczy uruchomić PHP w trybie debugowania z Twojego edytora (np. VS Code lub PhpStorm) i będziesz mógł kontrolować, co się dzieje w Twoim kodzie.

Logowanie do pliku – małe, ale skuteczne

Czasami po prostu trzeba sprawdzić, co dzieje się w różnych punktach programu. Wtedy świetnym rozwiązaniem jest logowanie do pliku. Możesz wykorzystać funkcję error_log() w PHP:

error_log(message: 'Sprawdzam zmienną $array: ' . print_r($array, true), message_type: 3, destination: '/var/tmp/debug.log');
💡
Dzięki temu zapiszesz zawartość zmiennej $array do pliku debug.log i będziesz wiedział, co się dzieje, nawet jeśli kod działa na serwerze i nie masz do niego bezpośredniego dostępu.

Używaj bloku try-catch i obsługi błędów

Nie zapominaj o obsłudze wyjątków w PHP! To dobra praktyka, żeby myśleć o błędach już na wczesnym etapie, ponieważ pomaga to w zarządzaniu nimi. Zamiast pozwalać na przerwanie wykonywania skryptu, złap wyjątek i obsłuż go:

try {
    $db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
} catch (PDOException $e) {
    echo 'Błąd połączenia z bazą danych: ' . $e->getMessage();
}
💡
Dzięki temu, gdy coś pójdzie nie tak, nie dostaniesz tylko komunikatu „500 Internal Server Error” – a otrzymasz dokładną informację o tym, co poszło nie tak.

Pisanie testów jednostkowych

Testowanie jednostkowe to kolejna świetna metoda na wykrywanie problemów we wczesnej fazie. Testy jednostkowe pozwalają sprawdzić, czy poszczególne fragmenty kodu działają zgodnie z oczekiwaniami, zanim trafią do produkcji.

Załóżmy, że masz funkcję do dodawania dwóch liczb:

function add(int $a, int $b): int {
    return $a + $b;
}

Napisz test jednostkowy, żeby upewnić się, że wszystko działa:

use PHPUnit\Framework\TestCase;

class AddTest extends TestCase {
    public function testAdd() {
        $this->assertEquals(5, add(2, 3));
    }
}
💡
Jeśli test się nie powiedzie, od razu będziesz wiedział, że coś jest nie tak z Twoją funkcją.

Podsumowanie

Debugowanie to jedna z najważniejszych umiejętności w pracy programisty. Im szybciej zaczniesz korzystać z narzędzi takich jak var_dump(), xdebug, logowanie do plików czy testy jednostkowe, tym szybciej znajdziesz rozwiązanie problemu. I nie zapomnij o raportowanych błędach! Często właśnie te komunikaty powiedzą Ci, gdzie szukać problemu.

Więc następnym razem, kiedy Twój kod przestanie działać, nie wpadaj w panikę. Zastosuj te triki, a debugowanie stanie się prostsze i szybsze. 😎

Daj znać, jeśli masz pytania, i powodzenia w kodowaniu! ✌️

0
Subscribe to my newsletter

Read articles from Andrzej Kostrzewa directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Andrzej Kostrzewa
Andrzej Kostrzewa