Last modified: February 06, 2023
This article is written in: 🇵🇱
Debugowanie to fundamentalny proces w tworzeniu oprogramowania, polegający na identyfikowaniu, analizowaniu i usuwaniu błędów (bugów) w kodzie źródłowym programu. Błędy te mogą prowadzić do nieprawidłowego działania aplikacji, awarii systemu lub nieoczekiwanych rezultatów. Debugowanie umożliwia programistom dokładne prześledzenie działania programu, co pozwala na zrozumienie, dlaczego program nie działa zgodnie z oczekiwaniami.
Proces ten jest niezbędny na każdym etapie cyklu życia oprogramowania, od fazy rozwoju po utrzymanie i aktualizacje. Dzięki debugowaniu programiści mogą:
Debugger to narzędzie oferujące zaawansowane funkcje ułatwiające analizę i naprawę kodu. Oto szczegółowy opis jego głównych funkcji:
Punkty przerwania (breakpoints):
if (count == 10)
.Krokowanie (stepping):
Inspekcja stanu:
Modyfikacja stanu:
Korzystanie z debuggera przynosi wiele korzyści, zarówno dla początkujących, jak i doświadczonych programistów:
print
), debugger pozwala na bezpośredni podgląd i interakcję.Zintegrowane środowiska programistyczne (IDE) oferują zaawansowane narzędzia debugowania, które są nieodłączną częścią nowoczesnego procesu tworzenia oprogramowania. Oto niektóre z ich funkcji:
pdb
pdb
jest wbudowanym debuggerem Pythona, który, mimo swojej prostoty, oferuje ma wiele do zaoferowania:
Istnieje kilka sposobów na rozpoczęcie sesji debugowania z użyciem pdb
:
Bezpośrednie wywołanie z linii poleceń:
python -m pdb script.py
Wstawienie punktu przerwania w kodzie:
Od Pythona 3.7 można użyć wbudowanej funkcji:
breakpoint() # Automatycznie uruchamia domyślny debugger
Lub tradycyjnie:
import pdb
pdb.set_trace()
Debugowanie wyjątków:
Aby debugger uruchamiał się automatycznie przy nieobsłużonych wyjątkach:
import sys
import pdb
def excepthook(type, value, traceback):
pdb.post_mortem(traceback)
sys.excepthook = excepthook
pdb
Podczas sesji z pdb
masz dostęp do szeregu poleceń:
Nawigacja:
n
/ next
: Przejście do następnej linii w bieżącej funkcji.s
/ step
: Wejście do funkcji wywoływanej w bieżącej linii.r
/ return
: Kontynuacja wykonania do momentu powrotu z bieżącej funkcji.c
/ continue
: Kontynuacja wykonania do następnego breakpointa.Informacje o stanie:
l
/ list
: Wyświetla kod źródłowy wokół bieżącej linii.w
/ where
: Wyświetla stos wywołań (call stack).p
/ print
: Wyświetla wartość wyrażenia.pp
/ pprint
: Wyświetla wartość wyrażenia w sposób sformatowany.Zarządzanie breakpointami:
b
/ break
: Ustawia breakpoint.cl
/ clear
: Usuwa breakpoint.disable
/ enable
: Dezaktywuje/aktywuje breakpoint.Pomoc i wyjście:
h
/ help
: Wyświetla pomoc dla poleceń.q
/ quit
: Kończy sesję debugowania.pdb
pdb
pozwala na interaktywną pracę z kodem:
Wyświetlanie wartości:
p variable_name # Wyświetla wartość zmiennej
Zmiana wartości:
variable_name = new_value # Ustawia nową wartość zmiennej
Wykonywanie wyrażeń:
Możesz wykonywać dowolne wyrażenia Pythona:
p len(my_list) # Wyświetla długość listy
Wywoływanie funkcji:
Uważaj jednak na skutki uboczne wywoływanych funkcji:
p my_function() # Wywołuje funkcję i wyświetla jej wynik
Podczas debugowania możesz potrzebować zatrzymać program w nowych miejscach:
Ustawianie breakpointów:
b 25 # Ustawia breakpoint na linii 25 bieżącego pliku
b my_module.py:10 # Ustawia breakpoint w pliku 'my_module.py' na linii 10
b my_function # Ustawia breakpoint na początku funkcji 'my_function'
Warunkowe breakpointy:
b 30, x > 5 # Zatrzyma program na linii 30, gdy 'x' jest większe od 5
Wyświetlanie breakpointów:
b # Wyświetla listę wszystkich breakpointów
Usuwanie breakpointów:
cl # Usuwa wszystkie breakpointy
cl 2 # Usuwa breakpoint numer 2
Warunkowe breakpointy są niezwykle przydatne w sytuacjach, gdy błąd występuje tylko przy określonych wartościach zmiennych lub w specyficznych warunkach.
Przykład zastosowania:
Jeśli pętla iteruje 1000 razy, ale błąd występuje tylko dla i == 500
, ustawienie breakpointa warunkowego pozwala na zatrzymanie programu dokładnie w tym momencie:
b loop.py:45, i == 500
Debugowanie złożonych warunków:
Możesz używać złożonych wyrażeń logicznych:
b process_data, len(data) > 100 and error_flag
pdb.set_trace()
w kodzie, warto dodawać komentarze, aby nie pozostawić ich przypadkowo w wersji produkcyjnej.pdb
, aby automatyzować powtarzające się czynności.pdb
można integrować z narzędziami takimi jak pytest
czy unittest
, aby debugować testy jednostkowe.pdb
, takie jak ipdb
czy pudb
, oferujące dodatkowe funkcje i interfejsy.