Programování

Debugování v Pythonu: breakpoint(), pdb a debugger ve VS Code

Jak hledat chyby v Pythonu – čtení tracebacku, breakpoint() a příkazy pdb, post-mortem ladění, podmíněné breakpointy a debugger ve VS Code.

12. 10. 2026 · 4 min čtení

Hromada print() volání je nejčastější způsob ladění a zároveň ten nejpomalejší. Python má vestavěný debugger, který program zastaví na libovolném místě a nechá vás prozkoumat proměnné, zavolat funkce a krokovat řádek po řádku. Tady je praktický průvodce.

Krok 0: přečtěte traceback zespodu

Traceback (most recent call last):
  File "app.py", line 18, in <module>
    main()
  File "app.py", line 15, in main
    celkem = spocitej(objednavky)
  File "app.py", line 9, in spocitej
    return sum(o["cena"] * o["ks"] for o in objednavky)
  File "app.py", line 9, in <genexpr>
    return sum(o["cena"] * o["ks"] for o in objednavky)
                ~^^^^^^^^
KeyError: 'cena'
  • Poslední řádek je typ a zpráva výjimky – začněte tady.
  • Řádek nad ním ukazuje, kde přesně se to stalo. Od Pythonu 3.11 značky ^^^^ označí i konkrétní výraz.
  • Výše je cesta volání. Hledejte nejnižší řádek, který patří vašemu kódu, ne knihovně.

Tady je jasné: některá objednávka nemá klíč cena. Kterou, zjistí debugger.

breakpoint(): zastavení programu

Od Pythonu 3.7 stačí vložit do kódu:

def spocitej(objednavky):
    breakpoint()
    return sum(o["cena"] * o["ks"] for o in objednavky)

Po spuštění se program zastaví a otevře se prompt (Pdb).

Nejdůležitější příkazy pdb

Příkaz Význam
l / ll výpis okolního kódu / celé funkce
n další řádek (do funkcí nevstupuje)
s vstoupit do volané funkce
c pokračovat do dalšího breakpointu
r doběhnout do konce aktuální funkce
p výraz / pp výraz vypsat hodnotu / hezky formátovaně
w kde jsem (zásobník volání)
u / d posun o úroveň nahoru / dolů v zásobníku
b 25 breakpoint na řádku 25
b 25, x > 100 podmíněný breakpoint
display výraz vypisuje výraz po každém kroku
interact plná interaktivní konzole s lokálními proměnnými
q ukončit

V našem příkladu:

(Pdb) pp [o for o in objednavky if "cena" not in o]
[{'id': 7, 'price': 120, 'ks': 1}]

Objednávka č. 7 přišla s anglickým klíčem. Chyba nalezena bez jediného print.

Pozor: jednopísmenné názvy proměnných kolidují s příkazy. Proměnnou n vypíšete jako p n, nebo výraz začněte vykřičníkem: !n.

Post-mortem: ladění až po pádu

Nemusíte vědět předem, kam breakpoint dát. Spusťte skript pod pdb:

python -m pdb -c continue app.py

Program běží normálně, a když spadne na nezachycené výjimce, debugger se otevře přímo v místě chyby se všemi proměnnými.

V interaktivní konzoli nebo Jupyteru po výjimce:

import pdb; pdb.pm()

Uvnitř except bloku:

except Exception:
    import pdb; pdb.post_mortem()

Vypnutí breakpointů bez úpravy kódu

PYTHONBREAKPOINT=0 python app.py

Funkce breakpoint() respektuje tuto proměnnou prostředí. Lze jí také nastavit jiný debugger, např. PYTHONBREAKPOINT=ipdb.set_trace (po pip install ipdb, který přidá barvy a doplňování).

Breakpointy do produkce samozřejmě necommitujte. Linter Ruff má pravidlo T100, které je najde.

Debugger ve VS Code

S rozšířením Python (a Python Debugger) od Microsoftu:

  1. Klikněte vlevo od čísla řádku – objeví se červená tečka.
  2. Stiskněte F5 a zvolte Python Debugger: Current File.

Pro opakované spouštění s argumenty vytvořte .vscode/launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "App s argumenty",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/app.py",
      "args": ["--vstup", "data.csv"],
      "console": "integratedTerminal",
      "justMyCode": true
    },
    {
      "name": "FastAPI",
      "type": "debugpy",
      "request": "launch",
      "module": "uvicorn",
      "args": ["main:app", "--reload"]
    }
  ]
}

Užitečné funkce:

  • Podmíněný breakpoint – pravým tlačítkem na tečku → Edit Breakpoint → výraz o.get("cena") is None.
  • Logpoint – místo zastavení vypíše zprávu (Objednávka {o}). Je to print, který nemusíte mazat.
  • Debug Console – vyhodnocuje výrazy v kontextu zastaveného programu.
  • justMyCode: false umožní krokovat i do knihoven.

Ladění testů

pytest --pdb          # debugger při selhání testu
pytest --trace        # zastaví na začátku každého testu
pytest -x --pdb -k nazev_testu

Ladění na vzdáleném serveru

Pro proces na serveru se dá použít debugpy:

import debugpy
debugpy.listen(("127.0.0.1", 5678))
debugpy.wait_for_client()

Port nikdy neotevírejte do internetu – připojte se přes SSH tunel (ssh -L 5678:127.0.0.1:5678 server) a ve VS Code použijte konfiguraci "request": "attach". Ještě jednodušší je otevřít celý projekt na serveru přes Remote-SSH a ladit lokálně tam.

Ladicí návyky

  1. Nejdřív reprodukujte. Chyba, kterou neumíte vyvolat, se opravuje naslepo.
  2. Zmenšete vstup na nejmenší, který chybu ještě vyvolá.
  3. Ověřte předpoklady, ne kód, o kterém „víte“, že funguje.
  4. Po opravě napište test, který by chybu chytil.

A když se zaseknete, vložte traceback i související funkci do ColdHost AI v režimu Řešení problémů. Pro zapeklité chyby s více moduly zvolte model Polaris, který nad problémem přemýšlí důkladněji.