|
| 1 | +# Debugování |
| 2 | + |
| 3 | +Při vývoji software se často dostaneme do situace, |
| 4 | +kdy si chceme projít kód krok za krokem a zjistit |
| 5 | +například to, jaké jsou aktuální hodnoty proměnných, |
| 6 | +jestli se správně vyhodnocují podmínky atd. |
| 7 | +Tomuto procesu se česky říká *ladění*, často se ale |
| 8 | +setkáte s anglickým výrazem *debugging*. Obvykle |
| 9 | +ho provádíme ve chvíli, kdy se program nechová |
| 10 | +podle očekávání, tedy jsme narazili na chybu (bug). |
| 11 | + |
| 12 | +Možná jste byly zvyklé si na různá místa v programu |
| 13 | +pomocí funkce `print` vypisovat aktuální stav programu. |
| 14 | +Zjistíte, že u většího projektu je tento přístup většinou |
| 15 | +nedostatečný a že si chcete program projít krok za krokem. |
| 16 | + |
| 17 | +Abychom mohli debugovat, potřebujeme k tomu nástroj zvaný |
| 18 | +*debugger*. VSCode spolu s [rozšířením pro Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) ho má zabudovaný. |
| 19 | +Ve zbytku této lekce si ukážeme, jak ho používat. |
| 20 | + |
| 21 | +## Ovládání debuggeru |
| 22 | +Do debuggeru se přepneme kliknutím na tlačítko s přeškrtnutým broukem, |
| 23 | +které vidíte na obrázku níže. |
| 24 | + |
| 25 | +{{ figure( |
| 26 | + img=static('debug.png'), |
| 27 | + alt="(Menu debuggeru)", |
| 28 | +) }} |
| 29 | + |
| 30 | +Zajímají nás především: |
| 31 | +- tlačítko pro spuštění debugování (zelený trojúhelník) |
| 32 | +- panel s výpisem aktuálních hodnot proměnných - *Variables* |
| 33 | +- panel pro ovládání debuggeru |
| 34 | + |
| 35 | +**Panel pro ovládání debuggeru** se zobrazí až po spuštění debuggeru. |
| 36 | +Po spuštění je možné debugger restartovat (spustit od začátku) |
| 37 | +kliknutím na zelenou šipku ve tvaru kruhu |
| 38 | +nebo ho zastavit kliknutím na červený čtvereček. |
| 39 | + |
| 40 | +Program se chová stejně, jako by debugger nebyl zaplý. |
| 41 | +Např., pokud se podmínka vyhodnotí jako `False`, tak do jejího těla debugger nevstoupí. |
| 42 | +Stejně tak debugger bude procházet cyklem tolikrát, jako za normálního |
| 43 | +běhu programu. |
| 44 | + |
| 45 | +### Breakpoint |
| 46 | +Klíčovou roli při debugování hraje zarážka - angl. *breakpoint*. |
| 47 | +Když debuger narazí na zarážku, tak zastaví vykonávání programu |
| 48 | +a předá kontrolu uživateli. Ten poté může zjistit hodnoty proměnných, |
| 49 | +pokračovat na další krok nebo třeba vejít do funkce, která se na řádku volá. |
| 50 | +Breakpoint umístíme kliknutím vlevo od řádku, kde chceme, aby se debugger zastavil: |
| 51 | + |
| 52 | +{{ figure( |
| 53 | + img=static('breakpoint.png'), |
| 54 | + alt="(Umístění breakpointu)", |
| 55 | +) }} |
| 56 | + |
| 57 | +Pokud klikneme na tlačítko *Continue* (modrý trojúhelník nebo <kbd>F5</kbd>), |
| 58 | +tak bude debugger pokračovat až do dalšího breakpointu, |
| 59 | +případně na konec programu. |
| 60 | + |
| 61 | +### Step over, into, out |
| 62 | +Často budeme chtít pokračovat na další řádek kódu. Docílíme toho pomocí |
| 63 | +klávesy <kbd>F10</kbd>, případně kliknutím na *Step over*. |
| 64 | + |
| 65 | +Pokud bychom chtěli vstoupit do funkce, která je volaná na aktualním řádku, |
| 66 | +tak toho docílíme pomocí <kbd>F11</kbd> - *Step into*. |
| 67 | + |
| 68 | +Pro vystoupení z aktuální funkce se používá |
| 69 | +<kbd>Shift</kbd> + <kbd>F11</kbd>. |
| 70 | +Program pokračuje až do chvíle, než se vrátí do funkce, která volala |
| 71 | +funkci, ze které jsme chtěli vystoupit. |
| 72 | + |
| 73 | +## Debug testů |
| 74 | +Často zjistíme, že nám neprocházejí testy. |
| 75 | +Může se jednat o chybu v testu, nebo o chybu v programu. |
| 76 | +Ideální je si test prodebugovat, a to například tak, |
| 77 | +že dáme breakpoint na začátek testu a pak se kombinací |
| 78 | +*Step over / into / out* dostaneme na problémové místo programu. |
| 79 | +Budeme sledovat, jak se vyhodnocují jednotlivé podmínky, |
| 80 | +jaké argumenty se předávají do funkcí atd. |
| 81 | +Často se nám tímto způsobem podaří chybu najít. |
| 82 | + |
| 83 | +Pokud máme správně nastavený VSCode, tak by se nad testovacími |
| 84 | +funkcemi měly objevit možnosti *Run Test* a *Debug Test* |
| 85 | +(jako na obrázku níže). |
| 86 | + |
| 87 | +{{ figure( |
| 88 | + img=static('test_debug.png'), |
| 89 | + alt="(Debug testu)", |
| 90 | +) }} |
| 91 | + |
| 92 | +Jestli ve svém editoru tyto možnosti nemáš, tak zkus: |
| 93 | +- zkontrolovat, že máš nastavený interpreter |
| 94 | + - v levém dolním rohu VSCode by jsi kromě verze Pythonu |
| 95 | + měla vidět jméno virtuálního prostředí (např. Python 3.6 (venv)) |
| 96 | + - pokud jméno virtuálního prostředí nevidíš, tak stiskni |
| 97 | + <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>, |
| 98 | + vyber *Select Python Interpreter* a zvol své virtuální prostředí |
| 99 | + (pravděpodobně *venv*) |
| 100 | +- Stisknout <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> a vybrat *Discover Unit Tests* |
| 101 | + |
| 102 | +Po kliknutí na *Debug test* se spustí debugger. |
| 103 | + |
| 104 | +## Debug console |
| 105 | +Po spuštění debugeru je možné používat debugovací konzoli. |
| 106 | +Najdete ji ve spodním panelu v záložce vedle integrovaného terminálu. |
| 107 | + |
| 108 | +{{ figure( |
| 109 | + img=static('debug_console.png'), |
| 110 | + alt="(Debug konzole)", |
| 111 | +) }} |
| 112 | + |
| 113 | +Představ si, že jsi spustila Python z příkazové řádky |
| 114 | +a poté zadala stejný kód, kterým debugger prošel, než se dostal na breakpoint. |
| 115 | +V tu chvíli tedy máte k dispozici všechny inicializované globální proměnné, |
| 116 | +můžete volat funkce nebo pracovat s proměnným úplně stejně, |
| 117 | +jak jsme to dělali v lekcích na začátku kurzu. |
| 118 | + |
| 119 | +Pokud například víte, že na dalším řádku vzniká `IndexError`, ale nevíte proč, |
| 120 | +tak můžete zjistit, na jaký index se přistupuje, jaké hodnoty jsou v |
| 121 | +seznamu nebo slovníku obsažené a co by se stalo, kdybyste použily jiný index. |
| 122 | + |
| 123 | +Do debug konzole se také vypisují `printy`, pokud je v programu používáte. |
| 124 | + |
| 125 | +Jen pozor - pokud upravíte hodnoty proměnných, |
| 126 | +tak se změny promítnout do zbytku programu, takže je někdy nutné |
| 127 | +debugger restartovat. |
0 commit comments