9.1 Pojawienie się bugów
Debugowanie oprogramowania to proces wyszukiwania i naprawiania błędów lub bugów w programie. To najbardziej interesująca część rozwoju oprogramowania, która pomaga zapewnić poprawne działanie programów.
Historia powstania terminu "bug"
Termin "bug" (błąd) w kontekście programów komputerowych zaczął być używany w latach 40. XX wieku. Chociaż sama koncepcja "bugów" istniała już przed pojawieniem się komputerów, oznaczając mechaniczne usterki w różnych urządzeniach.
Pierwszy udokumentowany przypadek użycia terminu "bug" w technice komputerowej miał miejsce w zespole pracującym przy komputerze Mark II na Uniwersytecie Harvarda w 1947 roku. Zespół odkrył, że jedno z przekaźników maszyny nie działało z powodu ćmy, która się w nim znalazła. Usunęli owada i zapisali to w dzienniku jako "pierwszy rzeczywisty przypadek odkrycia owada" (literal bug).
Chociaż nie był to pierwszy przypadek użycia terminu "bug" do oznaczenia błędu, ten incydent stał się znanym i przyczynił się do popularności terminu „bug”.

Debugowanie programu
Debugowanie to proces wyszukiwania, diagnozowania i naprawiania bugów w oprogramowaniu. Proces debugowania obejmuje kilka etapów:
- Wykrycie błędu: określenie objawów wskazujących na istnienie błędu w programie.
- Odtworzenie błędu: stworzenie warunków, w których błąd ponownie się ujawni, aby lepiej zrozumieć jego naturę.
- Diagnoza problemu: stosowanie różnych narzędzi i metod analizy kodu w celu znalezienia przyczyny błędu.
- Naprawa błędu: wprowadzanie zmian w kodzie w celu wyeliminowania błędu.
- Testowanie: sprawdzenie poprawki i testowanie programu, aby upewnić się, że błąd został usunięty i nie pojawiły się nowe problemy.
Więc bug — to ogólna nazwa dla wszelkich błędów w programach, a debug — to proces wykrywania i eliminowania tych błędów.
9.2 Narzędzia i metody debugowania
Logowanie
Dodanie logów w kodzie programu pozwala śledzić jego wykonanie i uzyskiwać informacje o stanie zmiennych i operacji w różnych punktach wykonania programu. Do logowania w JavaScript jest świetna biblioteka — winston.
Przykład użycia logowania:
const { createLogger, format, transports } = require('winston');
// Tworzymy logger z poziomem debug
const logger = createLogger({ level: 'debug' });
// Funkcja dzielenia
function divide(a, b) {
logger.debug(`Dzielimy ${a} przez ${b}`);
if (b === 0) {
logger.error("Próba dzielenia przez zero!");
return null;
}
return a / b;
}
// Przykład użycia funkcji
const result = divide(10, 2);
console.log(result); // Wyświetli: 5
Użycie debuggera
Debuggery to narzędzia, które pozwalają programistom wykonywać program krok po kroku, ustawiać punkty zatrzymania (breakpoints), sprawdzać wartości zmiennych i zmieniać je podczas wykonywania programu.
Popularne debugery dla JavaScript:
- Chrome DevTools: wbudowany debugger w przeglądarce Google Chrome
- Firefox Developer Tools: wbudowany debugger w przeglądarce Mozilla Firefox
- Node.js Debugger: wbudowany debugger dla serwerowego JavaScript w Node.js
- Visual Studio Code Debugger: debugger wbudowany w edytor Visual Studio Code
Przykład użycia debuggera w Node.js:
// Import wbudowanego modułu debugowania
const { inspect } = require('util');
// Przykład funkcji z błędem
function faultyFunction(a, b) {
debugger; // Ustawienie punktu zatrzymania
let result = a / b;
return result;
}
// Wywołanie funkcji z błędem
console.log(faultyFunction(10, 0));
Kiedy program osiąga debugger, zatrzymuje się, a ty możesz używać komend debuggera, takich jak krok naprzód (step over), wejście do środka (step into), wyjście (step out), sprawdzanie wartości zmiennych i inne.
Będziemy uczyć się debugowania programów na przykładzie debuggera wbudowanego w Intellij IDEA (wymagana wersja Ultimate Edition).
9.3 Użycie debug
W ogólnym zarysie debugowanie obejmuje aktywne używanie narzędzi i praktyk debugowania w celu wykrycia i eliminacji błędów.
Kroki debugowania:
- Ustawienie punktów zatrzymania: ustaw punkty zatrzymania w kodzie, aby zatrzymać wykonanie programu w interesujących cię miejscach.
- Wykonanie krokowe: wykonuj program krok po kroku, obserwując zmiany w stanie programu i wartości zmiennych.
- Analiza zmiennych: badaj wartości zmiennych i wyrażeń na różnych etapach wykonania programu, aby wykrywać nieprawidłowe dane lub błędy logiczne.
- Naprawa błędów: wprowadź zmiany w kodzie w celu wyeliminowania znalezionych błędów.
- Ponowne testowanie: po naprawieniu błędów przetestuj program, aby upewnić się, że błąd został usunięty i że nie pojawiły się nowe problemy.
Wydaje się proste, prawda? O tym dokładniej krok po kroku opowiemy sobie na następnym wykładzie :)
GO TO FULL VERSION