PuDB: výkonný debugger pro Python s retro uživatelským rozhraním

5. 6. 2018
Doba čtení: 19 minut

Sdílet

Už jsme se seznámili s několika debuggery určenými i pro ladění aplikací naprogramovaných v Pythonu. Prozatím jsme se nezmínili o debuggeru PuDB s rozhraním, které jako by z oka vypadlo slavnému Turbo Debuggeru.

Obsah

1. PuDB: výkonný debugger pro Python s retro uživatelským rozhraním

2. Ideový předchůdce PuDB – Turbo Debugger pro DOS a Microsoft Windows

3. PuDB vs. debuggery pro nativní aplikace

4. Instalace PuDB

5. První spuštění debuggeru a konfigurační dialog

6. Vestavěná nápověda

7. Regiony, na které je okno debuggeru rozděleno

8. Spouštění a krokování aplikací

9. Použití breakpointů

10. Nastavení vlastností breakpointů

11. Prohlížení obsahu zásobníkových rámců

12. Přeskok mezi zásobníkovými rámci (vyvolání historie)

13. Prohlížení obsahu proměnných

14. Složitější datové struktury

15. Použití vestavěného příkazového řádku při ladění aplikací

16. Post-mortem operace

17. Pády PuDB

18. Odkazy na Internetu

1. PuDB: výkonný debugger pro Python s retro uživatelským rozhraním

V článcích Grafická nadstavba nad GNU Debuggerem gdbgui a její alternativy a Trasování a ladění nativních aplikací v Linuxu: použití GDB a jeho nadstaveb jsme se seznámili jak s GNU debuggerem (známým i pod zkratkou GDB nebo gdb), tak i s dalšími debuggery dostupnými v Linuxu. Kromě toho jsme si ukázali i některé nadstavby vytvořené nad GNU debuggerem. Dále jsme si v dalším článku, tentokrát s titulkem Užitečné skripty a pluginy pro textový editor Vim: propojení Vimu s debuggery ukázali, jak je možné nakonfigurovat známý a oblíbený textový editor Vim takovým způsobem, aby ho bylo možné použít jako frontend (tedy ve funkci uživatelského rozhraní) pro různé typy debuggerů určených jak pro ladění aplikací naprogramovaných v céčku popř. C++ či aplikací vytvořených v Pythonu.

gdb1

Obrázek 1: Typické „sezení“ programátora využívajícího debugger gdb. Nastavení breakpointu příkazem b main, spuštění laděného programu příkazem r a krokování příkazem n (klávesa Enter zopakuje poslední zadaný příkaz, proto je n vlastně v tomto příkladu používán nadbytečně).

Pro aplikace naprogramované v Pythonu však existuje ještě jeden zajímavý a poměrně snadno ovladatelný debugger, který pro komunikaci s programátory používá plnohodnotné (celoobrazovkové) textové uživatelské rozhraní (TUI – Text-Based User Interface). Tento debugger se jmenuje PuDB a jeho uživatelské rozhraní je do značné míry inspirováno slavným Turbo Debuggerem, který si možná někteří čtenáři pamatují ze stařičkého DOSu i z Microsoft Windows (Turbo Debugger ovšem pochopitelně nebyl určen pro Python, ale pro aplikace naprogramované v Turbo/Borland Pascalu, Turbo C a později i Turbo C++). Dnes se seznámíme s možnostmi, které nám PuDB nabízí a pokusíme se tyto možnosti porovnat s dalšími debuggery dostupnými pro Python.

gdbtui

Obrázek 2: Aplikace gdbtui nabízí „alternativní“ celoobrazovkové ovládání debuggeru.

Poznámka: PuDB je projekt odlišný od podobně znějícího pydb.

2. Ideový předchůdce PuDB – Turbo Debugger pro DOS a Microsoft Windows

Historie vývoje a používání debuggerů je velmi dlouhá, protože se – vedle assemblerů, makroassemblerů a překladačů – jedná o nejstarší programátorské nástroje vůbec. Sálové počítače (mainframy) a později i minipočítače většinou obsahovaly speciální hardwarovou konzoli určenou pro ladění programů (představme si ovládací panel s tlačítky typu Run, Step atd.). Debuggery implementované jako běžné programy se pak nejvíce rozšířily na mikropočítačích. Mezi první debugger v moderním slova smyslu, tedy program nabízející celoobrazovkové uživatelské rozhraní a možnost interaktivní práce s ním, patří zejména IBM OLIVER (CICS interactive test/debug), jehož první verze vyšla již v roce 1972. K rychlému vývoji debuggerů pak došlo v osmdesátých a devadesátých letech, kdy se tyto nástroje staly nedílnou součástí integrovaných vývojových prostředí. Právě toto období nás bude zajímat nejvíc, protože v něm vznikl i Turbo Debugger.

td1

Obrázek 3: V minulosti velmi populární nástroj Turbo Debugger je vybaven celoobrazovkovým textovým uživatelským rozhraním (TUI) připomínajícím další produkty vytvořené společností Borland. Rozhraní a možnosti Turbo Debuggeru je stále možné považovat za etalon toho, jak by mohl vypadat moderní debugger s TUI či GUI.

V našich zemích byla populární především integrovaná vývojová prostředí prodávaná společností Borland (Turbo Pascal, Turbo C++, Turbo Pascal, Borland Pascal, částečně i Turbo Basic atd.), do kterých byl debugger postupně integrován. Navíc tato společnost vytvořila i již několikrát zmíněný Turbo Debugger, který měl podobný vzhled i ovládání jako další produkty Borlandu. První komerčně dostupná verze Turbo Debuggeru začala být nabízena již v roce 1989, a to buď jako samostatný produkt, nebo ho bylo možné koupit společně s Turbo Assemblerem (ten byl ovládaný z příkazového řádku) a později i s Turbo C. Později byly možnosti Turbo Debuggeru rozšířeny, aby plně podporovaly další produkty firmy Borland, především již zmíněné Turbo C++ a Turbo Pascal i Borland Pascal. S příchodem 16bitových procesorů Intel 286 a později i 32bitových procesorů i386 existoval Turbo Debugger ve třech variantách: 16bitová varianta pro reálný režim TD.EXE, 16bitová varianta pro chráněný režim TD286.EXE a konečně TD386.EXE, který mj. podporoval i HW breakpointy podporované tehdy novými procesory i386.

td2

Obrázek 4: Jedno ze speciálních oken Turbo Debuggeru, v němž se zobrazuje stav mikroprocesoru (obsahy pracovních registrů i příznakových bitů), obsah vybrané části operační paměti a taktéž zdrojový kód proložený disassemblovaným strojovým kódem (v této části okna je zvýrazněn právě prováděný řádek).

Při porovnání screenshotů na obrázcích 3 a 4 se screenshoty zobrazenými v navazujících kapitolách zjistíme, že se dnes popisovaný debugger PuDB skutečně Turbo Debuggeru podobá, což je ostatně jen dobře, protože TUI používaná firmou Borland jsou přehledná a snadno ovladatelná.

3. PuDB vs. debuggery pro nativní aplikace

Při dále uvedeném popisu možností debuggeru PuDB a při jeho srovnání například s GNU Debuggerem atd. by se mohlo zdát, že se vlastně jedná o poměrně jednoduchý nástroj, který uživatelům nenabízí příliš mnoho funkcí a technologií. Ve skutečnosti ovšem debugger určený to ladění aplikací ve vysokoúrovňovém Pythonu nemusí obsahovat tolik funkcí, jako debuggery pro nativní aplikace – například je možné zcela vynechat prohlížení obsahu registrů mikroprocesoru, oblastí operační paměti, disassemblovaného kódu (i když by bylo pěkné vidět bajtkód nebo dokonce AST) či obsahu řídicích registrů různých zařízení. Pro běžné ladění si vystačíme s oknem se zobrazeným zdrojovým kódem, obsahem proměnných, obsahem zásobníkových rámců, seznamem breakpointů a ideálně taktéž se seznamem běžících nebo pozastavených vláken. Kromě poslední možnosti jsou všechny ostatní funkce v PuDB dostupné. Navíc je k dispozici i příkazový řádek, díky němuž lze laděný program zkoumat i do větších podrobností.

dbg

Obrázek 5: Debuggery pro nativní aplikace musí umět zobrazit obsah registrů procesoru, vybraného regionu operační paměti popř. i disassemblovaný strojový kód.

4. Instalace PuDB

Instalace debuggeru PuDB je snadná, protože balíček s tímto nástrojem je dostupný na PyPi. Pro jeho instalaci tedy postačuje využít instalátor pip popř. pip3 a provést buď instalaci pro všechny uživatele:

$ pip3 install pudb

nebo instalaci pro právě aktivního uživatele:

$ pip3 install --user pudb

Debugger PuDB vyžaduje kupodivu instalaci pouze dvou závislostí, především knihovny urwid sloužící pro tvorbu aplikací s celoobrazovkovým textovým uživatelským rozhraním a taktéž knihovny nazvané Pygments, která je používána pro zobrazování syntaxe zdrojových kódů či konfiguračních souborů. Celá instalace by měla proběhnout prakticky okamžitě:

Downloading/unpacking pudb
  Downloading pudb-2018.1.tar.gz (56kB): 56kB downloaded
  Running setup.py (path:/tmp/pip_build_tester/pudb/setup.py) egg_info for package pudb
    /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'test_requires'
      warnings.warn(msg)
 
Requirement already satisfied (use --upgrade to upgrade): urwid>=1.1.1 in ./.local/lib/python3.4/site-packages (from pudb)
Requirement already satisfied (use --upgrade to upgrade): pygments>=1.0 in ./.local/lib/python3.4/site-packages (from pudb)
Installing collected packages: pudb
  Running setup.py install for pudb
    /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'test_requires'
      warnings.warn(msg)
 
    Installing pudb3 script to /home/tester/.local/bin
Successfully installed pudb
Cleaning up...

V případě lokální instalace bude spustitelný skript pudb nebo pudb3 dostupný v adresáři:

~/.local/bin

5. První spuštění debuggeru a konfigurační dialog

PuDB při svém spuštění vyžaduje zadání skriptu (modulu), který se má ladit. To je zajímavé, protože většinu ostatních debuggerů s GUI či TUI je možné nejprve spustit a teprve poté zadat soubor, s nímž se má pracovat:

$ pudb3
Usage: pudb3 [options] SCRIPT-TO-RUN [SCRIPT-ARGUMENTS]
 
Options:
  -h, --help          show this help message and exit
  -s, --steal-output
  --pre-run=COMMAND   Run command before each program run

Správné spuštění má tedy vypadat následovně:

$ pudb3 jméno_laděného_modulu.py

Obrázek 6: Spuštění debuggeru PuDB z příkazové řádky se zadáním jména laděného modulu.

Poznámka: debugger by měl korektně pracovat i ve virtuálním prostředí Pythonu, což si ostatně můžete snadno vyzkoušet ve svých aplikacích, samozřejmě za předpokladu, že venv nebo virtualenv používají. Použití je jednoduché – inicializujte virtuální prostředí Pythonu přesně tak, jak jste zvyklí a ihned poté (před spuštěním aplikace) inicializujte pudb/pudb3.

Po prvním spuštění debuggeru, tj. ve chvíli, kdy ještě neexistuje soubor ~/.config/pudb/pudb.cfg, se zobrazí okno se zprávou o základních možnostech tohoto nástroje, autorech, licenci atd.:

Obrázek 7: Zpráva zobrazená při prvním spuštění debuggeru.

Ihned poté se zobrazí další dialog, který je již z praktického hlediska důležitější. Tento dialog totiž obsahuje veškerou konfiguraci PuDB a samozřejmě se k němu můžete kdykoli vrátit zadáním klávesové zkratky Ctrl+P. Ovlivnit je možné jak vzhled aplikace (barevné schéma, tak i její chování při zobrazování obsahu proměnných, zásobníkových rámců apod.):

Obrázek 8: Dialog s konfiguračními volbami.

Pro opuštění konfiguračního dialogu je nutné stlačit šipku doprava (ne TAB) a vybrat si mezi uložením konfigurace a uzavřením dialogu. Ihned poté se dialog zavře a PuDB se nachází v základním ladicím režimu:

Obrázek 9: Pohled na textové uživatelské rozhraní debuggeru s pěti regiony.

6. Vestavěná nápověda

Tato kapitola bude velmi stručná. Nápověda se zobrazí klávesovou zkratkou F1 nebo ? a ukončuje se klávesou Enter (nikoli Esc). Samotná nápověda je v současné verzi PuDB poměrně stručná, obsahuje však jak základní koncepty, tak i všechny důležité klávesové zkratky.

Obrázek 10: Dialog s nápovědou k debuggeru PuDB.

7. Regiony, na které je okno debuggeru rozděleno

Celoobrazovkové textové uživatelské rozhraní aplikace PuDB je rozděleno do pěti oblastí (regionů), mezi nimiž se lze snadno přepínat a jejichž velikost je možné upravovat. Všech pět oblastí je vypsáno v tabulce společně s klávesovými zkratkami, které slouží pro přechod do vybrané oblasti. Navíc je do tabulky přidána i informace o výstupní konzoli, která zabírá celou plochu terminálu a tudíž je nutné se na ní přepnout klávesovou zkratkou:

Jméno Oblast Klávesová zkratka
code laděný modul se zobrazením breakpointů C
variables aktuálně viditelné proměnné V
stack zásobníkové rámce laděné aplikace S
breakpoints seznam všech uživatelem nastavených breakpointů B
internal shell interpret Pythonu, v němž lze manipulovat se stavem aplikace Ctrl+X
shell externí interpret Pythonu, v němž lze manipulovat se stavem aplikace !
output screen standardní terminálový výstup aplikace o

Ve skutečnosti je přepínání mezi regiony většinou ještě mnohem jednodušší (s výjimkou interního shellu) – je totiž možné využít běžné kurzorové šipky a přepnout se tak z horního levého regionu na regiony umístěné v pravém sloupci a naopak. I šipky nahoru/dolů slouží pro přepnutí mezi regiony, protože pokud kurzor dojede na začátek/konec seznamu (proměnných, zásobníkových rámců, breakpointu), přepne se do dalšího regionu.

Obrázek 11: Rozdělení okna PuDB na pět oblastí.

Poznámka: prakticky všechny screenshoty, které v dnešním článku naleznete, byly vytvořeny v terminálu o velikosti 80×25 znaků, takže by se mohlo zdát, že některé oblasti (zásobníkové rámce atd.) jsou relativně malé a nepřehledné. Ovšem samozřejmě není žádný problém spustit PuDB v terminálu s větším počtem textových řádků a/nebo znaků na řádek, což je ukázáno na dalším screenshotu.

Obrázek 12: Spuštění PuDB v terminálu s větším počtem textových řádků i počtu znaků na řádek. V debuggeru je laděna aplikace pro výpočet Ackermannovy funkce.

Velikost jednotlivých regionů se upravuje klávesovými zkratkami:

Klávesa Význam
+ horizontální zvětšení o cca 1/15 sloupců
horizontální zmenšení o cca 1/15 sloupců
= horizontální zvětšení na maximální povolenou šířku
_ horizontální zmenšení na minimální povolenou šířku
[ vertikální zvětšení o jeden řádek
] vertikální zmenšení o jeden řádek

8. Spouštění a krokování aplikací

Nejdůležitější funkcí debuggeru je samozřejmě spouštění aplikací s možností jejich pozastavení (na breakpointech) a krokování. K tomu slouží několik klávesových zkratek, které jsou však platné pouze ve chvíli, kdy je aktivní levá horní oblast (code area):

Klávesa Význam Popis
r run spuštění aplikace (přechod na vstupní bod skriptu)
q quit ukončení aplikace a zobrazení dialogu, jaká akce se má provést (restart etc.)
n next krokování: přechod na další příkaz; volání funkce je chápáno jako jediný krok
s step into krokování: přechod na další příkaz; při volání funkce se přejde do volané funkce
c continue konec krokování pokračování běhu aplikace (až do jejího konce nebo do přístupu na breakpoint)
f finish dokončení funkce, v němž se program nachází (počká se na posledním return)

Obrázek 13: Krokování aplikace. V tomto barevném schématu je aktuální řádek zobrazen inverzně bíle. Navíc je zapnuto zobrazení čísel řádků, takže vidíme, že se nacházíme ve zdrojovém kódu na řádku číslo 47.

Obrázek 14: Dialog zobrazený po dokončení běhu aplikace, v němž se může vývojář rozhodnout, jestli se má program spustit znovu, zahájit tzv. post mortem zkoumání stavu aplikace či zda se má PuDB ukončit.

9. Použití breakpointů

Jednou z nejdůležitějších vlastností debuggeru je jeho schopnost nastavovat breakpointy na vybraná místa v laděném programovém kódu, a to většinou buď na konkrétní programový řádek, nebo v některých případech dokonce na určitou strojovou instrukci. Tuto druhou možnost sice PuDB nenabízí (ani pro bajtkód), ale breakpointy v něm je samozřejmě možné používat a to dokonce velmi snadno. Pro nastavení breakpointu slouží klávesa b, kterou je možné stisknout ve chvíli, kdy se kurzor nachází v oblasti se zdrojovým kódem (code area).

Obrázek 15: Nastavení breakpointu v laděném zdrojovém kódu.

Informace o nově vytvořeném breakpointu by se měla ihned objevit v seznamu breakpointů (pravá dolní oblast) a současně by se měl příslušný řádek obarvit. V případě výchozího barvového schématu (styl původního Turbo Debuggeru) je tento řádek zobrazen se žlutým písmem a červeným pozadím. Po spuštění aplikace klávesou r nebo při jejím znovuspuštění klávesou c se běh programu na daném breakpointu zastaví a je možné začít krokování, prohlížení obsahu proměnných, zásobníkových rámců apod.

Obrázek 16: Zastavení laděné aplikace na breakpointu (změněné barvové schéma).

V oblasti breakpoints se používají tyto klávesové zkratky:

Klávesa Význam
e povolení nebo zákaz breakpointu
d vymazání breakpointu
Enter nastavení vlastností breakpointu

Obrázek 17: Zastavení laděné aplikace na breakpointu (další změněné barvové schéma).

10. Nastavení vlastností breakpointů

Ve výchozím nastavení se laděná aplikace zastaví při každém přístupu na breakpoint. Ovšem v některých případech potřebujeme, aby bylo řízení poněkud sofistikovanější. K tomu slouží konfigurace breakpointů, ke které se dostaneme takto – klávesou B (velké B, protože malé slouží k vytvoření breakpointu) se přepneme do oblasti breakpoints se seznamem všech uživatelem nastavených breakpointů. Dále je již možné snadno šipkami vybrat určený breakpoint a po stlačení klávesy Enter zobrazit dialog s podrobnější konfigurací. V tomto dialogu je možné nastavit následující vlastnosti:

  • Podmínka, která musí být splněna, aby se aplikace na breakpointu zastavila.
  • Počet průchodů breakpointem, které se sice budou počítat, ale aplikace se zastaví až po N průchodech.
  • Kombinace obou předchozích možností – použití počitadla až po splnění podmínky.
  • Breakpoint je možné zakázat či povolit příslušným checkboxem.

Obrázek 18: Nastavení základních vlastností breakpointu.

Informace o nastavených breakpointech zůstane zachována i pro další spouštění debuggeru. Je totiž automaticky ukládána do souboru ~/.config/pudb/saved-breakpoints-3.6 (nebo pod podobným názvem). Obsah tohoto souboru si můžete jednoduše prohlédnout, protože se jedná o čitelný textový soubor:

b /home/tester/python/vapory-examples/scene3.py:33
b /home/tester/python/vapory-examples/scene3.py:65
b /home/tester/python/vapory-examples/scene5.py:139
b /home/tester/python/vapory-examples/scene3.py:21, n == 5
b /home/tester/src/python/python-type-hints/test.py:18
b /home/tester/src/python/python-type-hints/test.py:20
b /home/tester/temp/factorial2_2.py:2, n==5
b /home/tester/temp/python/jython-examples/benchmark1/mandelbrot.py:35
Poznámka: kupodivu se nezachová informace o tom, který breakpoint byl povolen a který ne, takže při dalším spuštění budou povoleny všechny breakpointy.

11. Prohlížení obsahu zásobníkových rámců

Další důležitou vlastností naprosté většiny moderních debuggerů je schopnost prohlížení zásobníkových rámců (stack frames) s tím, že je možné vrátit běh programu do zvoleného místa v minulosti (což ovšem samozřejmě neznamená, že se vrátí i celý stav aplikace). V případě, že je aplikace pozastavena na breakpointu nebo při post-mortem stavu je možné se klávesou S (velké S, protože malé s je krokovací operace) přepnout na výpis obsahu všech zásobníkových rámců od vstupu do aplikace až po místo v právě prováděné funkci.

Obrázek 19: Postupné zanořování do funkce pro výpočet faktoriálu (winding phase).

Obrázek 20: Procházení zásobníkovými rámci při ladění Ackermannovy funkce.

12. Přeskok mezi zásobníkovými rámci (vyvolání historie)

Mezi jednotlivými zásobníkovými rámci se pohybujeme s využitím kurzorových šipek a po výběru rámce stačí stisknout klávesu Enter. Program se ihned přepne na daný rámec, což je patrné i v oblasti se zobrazením zdrojového kódu – viz též následující dvojice screenshotů:

Obrázek 21: Průchod zásobníkovými rámci jednoduché testované aplikace se třemi funkcemi, které se navzájem volají.

Obrázek 22: Průchod zásobníkovými rámci jednoduché testované aplikace se třemi funkcemi, které se navzájem volají.

13. Prohlížení obsahu proměnných

Nejsložitější je oblast nazvaná Variables, která nabízí prohlížení obsahu vybraných proměnných popř. návratových hodnot prakticky libovolných výrazů. V této oblasti se automaticky zobrazují hodnoty argumentů funkcí a před návratem z funkce i vypočtená návratová hodnota, ovšem pomocí klávesy n je možné přidat další proměnnou a/nebo výraz, který sleduje hodnoty dalších proměnných. V případě, že je proměnná či výraz vybraná, zobrazí se po stisku klávesy Enter dialog, v němž je možné zvolit, jakým způsobem se obsah proměnné zobrazí. Využívá se zde možností introspekce Pythonu:

Obrázek 23: Nastavení zobrazení vybrané proměnné.

V oblasti Variables se používají tyto klávesové zkratky:

Klávesa Význam
n přidání nové proměnné nebo výrazu
\ expanze obsahu proměnné (viz další kapitolu)
t změna způsobu zobrazení: typ proměnné
r změna způsobu zobrazení: výsledek repr()
s změna způsobu zobrazení: výsledek str()
c změna způsobu zobrazení: podle konfigurace PuDB
h vybraná proměnná/výraz bude zvýrazněna, což pomáhá k lepší orientaci
w zapne nebo vypne zalamování řádků u proměnných s dlouhým obsahem (seznamy, řetězce)
* přepínání způsobu zobrazení obsahu tříd (public, private, all)
m zapnutí či vypnutí zobrazení metod u objektů

Obrázek 24: Dialog pro přidání další proměnné či sledovaného výrazu.

14. Složitější datové struktury

V případě složitějších datových struktur, například seznamu seznamů:

y = [1,2,3,[4,5,6]]

je nutné pro zobrazení vnitřních podstruktur používat klávesovou zkratku \. Ta nefunguje rekurzivně (alespoň ne v současné verzi PuDB), takže je většinou nutné vybírat i jednotlivé podstruktury a stlačit \ několikrát. U výše zmíněného seznamu jen dvakrát:

y: list (4) [pub]
| 0: 1
| 1: 2
| 2: 3
| 3: list (3) [pub]
| | 0: 4
| | 1: 5
| | 2: 6

Ovšem můžeme mít i složitější strukturu:

x = {
    "left": {
        "left": 1,
        "middle": 2,
        "right": 3},
    "middle": {
        "left": 4,
        "middle": 5,
        "right": 6},
    "right": {
        "left": 7,
        "middle": 8,
        "right": 9}}

Tu lze zobrazit například následujícím způsobem:

Obrázek 25: Zobrazení rekurzivní datové struktury, v tomto případě slovníku s dalšími slovníky.

15. Použití vestavěného příkazového řádku při ladění aplikací

V některých případech může být velmi užitečný vestavěný příkazový řádek, který programátorům zpřístupňuje vybraný interpret Pythonu. Ve skutečnosti je celé ladění prováděno v rámci vybraného interpretru, takže z příkazového řádku má programátor přímý přístup ke všech modulům, třídám, objektům, funkcím i proměnným, které jsou dostupné nejenom pro čtení, ale i (pro metody/funkce) pro volání a v případě objektů a proměnných i pro zápis. Do příkazového řádku je možné se přepnou klávesovou zkratkou ! (v případě výchozího nastavení) nebo vždy klávesou Ctrl+X.

Obrázek 26: Přístup ke stavu programu i po jeho ukončení (v rámci post-mortem).

Klávesa Význam
Ctrl+P hledání v historii již zapsaných příkazů (previous)
Ctrl+N hledání v historii již zapsaných příkazů (next)
Tab automatické doplňování jmen objektů, metod, funkcí nebo proměnných

Obrázek 27: V rámci příkazového řádku lze provádět i různé výpočty.

Poznámka: ve výchozím nastavení je funkce klávesových zkratek ! a Ctrl+X stejná, ovšem pokud v konfiguračním dialogu (Ctrl+P) zvolíte jiný interpret, například IPython, bude chování zkratky ! odlišné.

16. Post-mortem operace

Ve chvíli, kdy je laděná aplikace ukončena, ať již běžným způsobem nebo pádem, není informace o průběhu jejího běhu a ladění zcela ztracená, protože je možné provádět takzvané post-mortem zkoumání „mrtvolky“ aplikace. Co se má s právě ukončenou aplikací provádět se PuDB zeptá v následujícím dialogu:

Obrázek 28: Úspěšné ukončení aplikace.

V post-mortem stavu je možné si prohlížet zásobníkové rámce, sledované proměnné apod. V této části ovšem PuDB obsahuje chybu, takže po ukončení aplikace je například nemožné nastavovat vlastnosti sledovaných proměnných (což je logické, protože už nemůže pracovat introspekce, ovšem k pádu debuggeru by dojít nemělo).

Obrázek 29: Post-mortem stav.

17. Pády PuDB

PuDB je sice při běžné práci dostatečně stabilní, ovšem přesto může dojít k situaci, kdy dojde k jeho pádu nebo pouze k nahlášení chyby. Chyba nastane ve chvíli, kdy se pokusíme načíst zdrojový kód, který neodpovídá syntaktickým pravidlům Pythonu (typicky se jedná o chybějící čárku, dvojtečku nebo závorku). K pádu PuDB v mém případě došlo pouze několikrát, a to při manipulaci se seznamem breakpointů (pokus o vymazání breakpointu, o kterém si PuDB myslel, že již neexistuje) a proměnných v post-mortem stavu. V případě, že dojde k pádu, nabídne PuDB možnost ladit sama sebe, což kupodivu poměrně dobře funguje:

Obrázek 30: Při pádu PuDB je možné začít tento debugger ladit.

bitcoin školení listopad 24

Obrázek 31: I přes některé problémy je použití PuDB uživatelsky mnohem příjemnější, než použití klasického Pdb.

Obrázek 32: Použití Pdb při ladění funkce pro výpočet faktoriálu.

18. Odkazy na Internetu

  1. Introduction to the PuDB Python Debugging Tool
    http://heather.cs.ucdavis­.edu/~matloff/pudb.html
  2. pudb’s documentation
    https://documen.tician.de/pudb/
  3. pudb 2018.1 na PyPi
    https://pypi.org/project/pudb/
  4. PuDB, the IDE debugger without an IDE!
    https://www.youtube.com/watch?v=IEXx-AQLOBk
  5. Grafická nadstavba nad GNU Debuggerem gdbgui a její alternativy
    https://www.root.cz/clanky/graficka-nadstavba-nad-gnu-debuggerem-gdbgui-a-jeji-alternativy/
  6. Užitečné skripty a pluginy pro textový editor Vim: propojení Vimu s debuggery
    https://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-propojeni-vimu-s-debuggery/
  7. gdbgui 0.7.8.3: browser-based gdb frontend using Flask and JavaScript to visually debug C, C++, Go, or Rust
    https://pypi.python.org/pypi/gdbgui
  8. Repositář projektu gdbgui
    https://github.com/cs01/gdbgui
  9. gdbgui – examples
    https://github.com/cs01/gdbgu­i/tree/master/examples
  10. Debuggery a jejich nadstavby v Linuxu
    http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu/
  11. Debuggery a jejich nadstavby v Linuxu (2. část)
    http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-2-cast/
  12. Debuggery a jejich nadstavby v Linuxu (3): Nemiver
    http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-3-nemiver/
  13. Debuggery a jejich nadstavby v Linuxu (4): KDbg
    http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-4-kdbg/
  14. Debuggery a jejich nadstavby v Linuxu (5): ladění aplikací v editorech Emacs a Vim
    http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-5-ladeni-aplikaci-v-editorech-emacs-a-vim/
  15. GDB – Dokumentace
    http://sourceware.org/gdb/cu­rrent/onlinedocs/gdb/
  16. GDB – Supported Languages
    http://sourceware.org/gdb/cu­rrent/onlinedocs/gdb/Suppor­ted-Languages.html#Supported-Languages
  17. Borland Turbo Debugger
    https://en.wikipedia.org/wi­ki/Borland_Turbo_Debugger
  18. GNU Debugger (Wikipedia)
    https://en.wikipedia.org/wi­ki/GNU_Debugger
  19. The LLDB Debugger
    http://lldb.llvm.org/
  20. Debugger (Wikipedia)
    https://en.wikipedia.org/wi­ki/Debugger
  21. 13 Linux Debuggers for C++ Reviewed
    http://www.drdobbs.com/testing/13-linux-debuggers-for-c-reviewed/240156817
  22. Reverse Engineering Tools in Linux – strings, nm, ltrace, strace, LD_PRELOAD
    http://www.thegeekstuff.com/2012/03/re­verse-engineering-tools/
  23. An Introduction To Using GDB Under Emacs
    http://tedlab.mit.edu/~dr/gdbin­tro.html
  24. GNU Emacs
    https://www.gnu.org/softwa­re/emacs/emacs.html
  25. The Emacs Editor
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­macs/index.html
  26. Emacs Lisp
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­lisp/index.html
  27. An Introduction to Programming in Emacs Lisp
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­intr/index.html
  28. 27.6 Running Debuggers Under Emacs
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­macs/Debuggers.html
  29. GdbMode
    http://www.emacswiki.org/e­macs/GdbMode
  30. Emacs (Wikipedia)
    https://en.wikipedia.org/wiki/Emacs
  31. Emacs Lisp (Wikipedia)
    https://en.wikipedia.org/wi­ki/Emacs_Lisp
  32. Pyclewn installation notes
    http://pyclewn.sourceforge­.net/install.html
  33. pip Installation
    https://pip.pypa.io/en/la­test/installing.html
  34. Clewn
    http://clewn.sourceforge.net/
  35. Clewn installation
    http://clewn.sourceforge.net/in­stall.html
  36. Clewn – soubory
    http://sourceforge.net/pro­jects/clewn/files/OldFiles/
  37. KDbg: úvodní stránka
    http://www.kdbg.org/
  38. Nemiver (stránky projektu)
    https://wiki.gnome.org/Apps/Nemiver
  39. Basic Assembler Debugging with GDB
    http://dbp-consulting.com/tutorials/de­bugging/basicAsmDebuggingGDB­.html
  40. Nemiver FAQ
    https://wiki.gnome.org/Ap­ps/Nemiver/FAQ
  41. Nemiver (Wikipedia)
    https://en.wikipedia.org/wiki/Nemiver
  42. Data Display Debugger
    https://www.gnu.org/software/ddd/
  43. GDB – Dokumentace
    http://sourceware.org/gdb/cu­rrent/onlinedocs/gdb/
  44. BASH Debugger
    http://bashdb.sourceforge.net/
  45. The Perl Debugger(s)
    http://debugger.perl.org/
  46. Visual Debugging with DDD
    http://www.drdobbs.com/tools/visual-debugging-with-ddd/184404519
  47. Pydb – Extended Python Debugger
    http://bashdb.sourceforge.net/pydb/
  48. Debugging
    http://janus.uclan.ac.uk/pa­gray/labs/debug.htm
  49. Insight
    http://www.sourceware.org/insight/

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.