Martin Svoboda

Martin Svoboda - Blog

Debugging


Debugging, nebo česky ladění, je nezbytnou součástí programování. Přestože se často přehlíží, ladění je zásadní dovednost, kterou by měl každý programátor zvládnout. Tato dovednost pomáhá identifikovat, vyhledávat a opravovat chyby v kódu, čímž zajišťuje správný chod aplikací.

Co je debugging?

Debugging nebo česky občas ladění. Ladění je proces odstraňování chyb z programu. Jako programátor se často setkáte s tím, že váš kód nebude fungovat, jak jste si představovali. To je naprosto normální, a proto je debugging jednou z nejčastějších činností při vývoji softwaru.

Bez ohledu na úroveň zkušeností programátora, vždy se objeví chyby. Profesionální vývojáři tráví významnou část času laděním svých aplikací, což často odlišuje dobré programátory od skvělých.

Čím zkušenější programátor, tím méně drobných chyb dělá, ale tím složitější projekty řeší. To znamená, že celkový počet chyb v kódu zůstává podobný.

Kroky při ladění

Proces ladění lze shrnout do několika kroků:

  1. Identifikace problému: Prvním krokem je zjistit, že program nefunguje správně. Může se jednat o chybovou hlášku nebo nesprávný výstup.
  2. Izolování problému: Po identifikaci je třeba určit přesné místo v kódu, kde se chyba vyskytuje. To lze provést pečlivým procházením kódu nebo pomocí debuggeru.
  3. Oprava problému: Jakmile lokalizujete chybu, musíte přijít na to, jak ji opravit. Může jít o úpravu kódu nebo změnu celé logiky.
  4. Testování řešení: Po provedení opravy je třeba program otestovat, aby se ověřilo, že chyba byla odstraněna a nevznikly nové problémy.

Typy chyb

Při ladění se obvykle setkáte se třemi hlavními typy chyb:

1. Chyby syntaxe

Syntaktické chyby, známé také jako chyby při parsování, jsou pravděpodobně nejčastějším druhem chybových hlášek, které se objevují zejména na začátku. Pokud se ve vašem kódu vyskytne syntaktická chyba, interpret jazyka Python si bude stěžovat a zastaví se.

K syntaktickým chybám dochází, když parser zjistí nesprávný příkaz. Příčinou syntaktické chyby může být chybějící závorka, závorka navíc nebo chybně umístěný operátor.

Příklad:

print("Ahoj, světe!")
print("Ahoj, světe!"
print("Končím!")

Zde chybí závorka a chybová hláška je:

  File "kurz_python/codes/debugging_syntax_error.py", line 4
	print("Ahoj, světe!"
     	^
SyntaxError: '(' was never closed

Chybová hláška nám říka, že jde o SyntaxError, tedy o chybu syntaxe a dále říká, že závorka nebyla nikdy uzavřena. Navíc chybová hláška ukazuje číslo řádku. Všimni si, že nebylo vypsáno první “Ahoj, světe!”, to proto, že syntaktická chyba se objeví ve fázi čtení celého programu.

Další příklad:

print("Ahoj, světe!")
if x == 5
    print("x je rovno 5")
print("Končím!")

Chybová hláška:

  File "kurz_python/codes/debugging_syntax_error.py", line 10
	if x == 5
         	^
SyntaxError: expected ':'

Opět chyba syntaxe. Očekávám :

Další příklad:

print("Ahoj, světe!")
if x = 5:
    print("x je rovno 5")
print("Končím!")

Chybová hláška:

  File "kurz_python/codes/debugging_syntax_error.py", line 14
	if x = 5:
   	^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

Opět chyba syntaxe a napovídá nám, že bychom měli použít = místo ==.

Jak vidíte, Python nás upozorňuje na to, že závorka není uzavřena. Tyto chyby jsou relativně snadno odhalitelné, protože Python zastaví vykonávání kódu a poskytne nám jasnou chybovou zprávu.

2. Chyby běhu

Chyby běhu nastávají během samotného vykonávání programu. Mezi nejčastější chyby běhu patří TypeError, NameError, IndexError nebo ZeroDivisionError.

Nejlepší způsob jak řešit chyby běhu jsou vyjímky, ale na ty se podíváme někdy později. Nicméně některé chyby běhu lze vyřešit podmínkami.

Pojdmě si opět vytvořit pár chyb a vyřešit je:

print("Ahoj, světe!")
jmeno = 5
print("Ahoj, " + jmeno)
print("Končím!")

chybobá hláška:

  File "kurz_python/codes/debugging_runtime_error.py", line 5, in <module>
	print("Ahoj, " + jmeno)
TypeError: can only concatenate str (not "int") to str

Problém je, že nemůžeme sčítat string a číslo. Můžeme to napravit převodem na str nebo f-stringem. Všimni si, že narozdíl od syntaktické chyb se vypsalo “Ahoj, světe!”, to proto, že k chybě došlo až při vykonávání programu.

Oprava:

# oprava
jmeno = 5
print("Ahoj, " + str(jmeno))


# nebo
jmeno = 5
print(f"Ahoj, {jmeno}")

Další příklad:

pirnt("Ahoj, světe!")

Místo print máme print.

Chybová hláška:

Traceback (most recent call last):
  File "kurz_python/codes/debugging_syntax_error.py", line 7, in <module>
	pirnt("Ahoj, světe!")
NameError: name 'pirnt' is not defined. Did you mean: 'print'?

Hláška říká, že jde o NameError, mohlo by se zdát, že jde o syntaktickou chybu, ale funkce pirnt by mohla existovat. Takže překlep v názvu funkcí se projevuje jako chyba běhu a ne syntaxe. Hlášení dále říká, že pirnt není definován a dokonce se nás ptá zna nemáme namysli print.

Stejný problém by byl kdybychom chtěli použít proměnnou, kterou jsme nedefinovali:

print(y)

chybobá hláška:

Traceback (most recent call last):
  File "kurz_python/codes/debugging_runtime_error.py", line 16, in <module>
	print(y)
NameError: name 'y' is not defined

Tuto chybu už známe


Zde je další příklad

```python
a = 5
b = 0
print(a / b)

Chybová hláška:

Traceback (most recent call last):
  File "kurz_python/codes/debugging_runtime_error.py", line 29, in <module>
	print(a / b)
ZeroDivisionError: division by zero

Hláška nás upozorňuje, že nulou nelze dělit. Oprava je jednoduchá, použijeme podmínku:

Oprava:

a = 5
b = 0
if b == 0:
    print("Nulou nelze dělit.")
else:
    print(a / b)

Chyby běhu můžou být různé a projevovat se různě. Některé se projevý vždy některé se mohou projevit jen v některých případech. Často se stává, že se chyby v programu odhalují až v průběhu času a proto je třeba kód průběžně aktualizovat a udržovat.

3. Logické chyby

Logické chyby jsou nejtěžší k odhalení, protože program běží bez chybových hlášek, ale nedává očekávané výsledky.

Příklad:

a = int(input("Zadej první číslo: "))
b = int(input("Zadej druhé číslo: "))
prumer = a + b / 2
print(f"Průměr čísel {a} a {b} je {prumer}.")

Chybně jsme vypočítali průměr dvou čísel, protože jsme nepoužili závorky: a + (b / 2) místo správného (a + b) / 2.

Techniky ladění

1. Použití příkazu print

Nejjednodušší metodou je vkládání příkazů print do kódu, abychom mohli sledovat hodnoty proměnných a průběh programu.

Příklad:

a = int(input("Zadej první číslo: "))
b = int(input("Zadej druhé číslo: "))
print(f"a = {a}, b = {b}")  # debug výpis
prumer = (a + b) / 2
print(f"prumer = {prumer}")  # debug výpis

2. Použití debuggeru

Moderní IDE jako VSCode nebo PyCharm mají vestavěné nástroje pro ladění, které umožňují zastavovat program na určitých řádcích (tzv. breakpoints), procházet kód po řádcích a sledovat aktuální hodnoty proměnných.

Ukázka debuggeru v IDE s vyznačenými breakpoints

Místo ctrl+f5 spustíme kód pouze pomocí f5 tj. run debugging.

Spouštění ladění v VSCode

Nahoře se zobrazí malý panýlek k ovládání debuggeru.

Ovládání debuggeru

Díky němu můžeme skákaz na další breakpoint nebo procházet kódem řádek po řádku.

Ladění v průběhu

V panelu nalevo by se měli zobrazovat aktuální hodnoty proměnných.

Proměnné v debuggeru

Jde o velice silný nástroj.!

3. Revize kódu

Kontrola kódu může odhalit chyby, které se v kódu objevily, ale nejsou zjevné. Kromě automatizovaných nástrojů je dobré provádět ruční kontrolu, ideálně ve spolupráci s kolegou.

Moderní doba nám umožňuje používat pro revizi také umělou inteligenci, ať už chatGPT, Claude či Gemini. Tyto nástroje dokáží odhalit chyby, které bychom jinak přehlédli. Ale pozor, i tyto nástroje mohou dělat chyby, tak jako my nebo naši kolegové.

Shrnutí

Ladění je základní dovednost, která odděluje zkušené programátory od těch méně zkušených. Každý programátor se setká s chybami v kódu, ale důležité je vědět, jak efektivně chyby odhalovat a opravovat.

Nejdůležitější typy chyb jsou:

  • Syntaktické chyby: chybné příkazy
  • Chyby běhu: chyby při vykonávání programu
  • Logické chyby: nesprávná logika programu

Mezi efektivní techniky ladění patří:

  • Použití příkazu print pro výpis proměnných
  • Využití debuggeru v IDE
  • Revize kódu

Pamatujte, že ladění je nevyhnutelnou součástí vývoje softwaru, a čím zkušenější budete, tím lépe budete své chyby odstraňovat. 😊