Ve druhé části článku o debuggerech dostupných programátorům v Linuxu si popíšeme nadstavbu nad GNU Debuggerem, která se jmenuje Data Display Debugger (zkráceně DDD či přesněji GNU DDD). Data Display Debugger nabízí svým uživatelům plnohodnotné grafické uživatelské rozhraní a kromě kooperace s GNU Debuggerem je DDD možné použít i při ladění aplikací naprogramovaných v Perlu, Pythonu či BASHi.
Obsah
1. Debuggery a jejich nadstavby v Linuxu (2. část)
2. Data Display Debugger (GNU DDD)
3. Použití Data Display Debuggeru společně s GNU Debuggerem
4. Prohlížení složitějších datových struktur
5. Použití Data Display Debuggeru společně s Python Debuggerem
6. Použití Data Display Debuggeru společně s BASH Debuggerem
7. Další debuggery podporované DDD
1. Debuggery a jejich nadstavby v Linuxu (2. část)
V první části článku o debuggerech a jejich nadstavbách jsme se nejprve zabývali stručnou historií vývoje těchto užitečných vývojářských nástrojů a posléze jsme si řekli, že moderní debuggery je možné rozdělit na dvě skupiny. V první skupině nalezneme nástroje ovládané z příkazového řádku a ve druhé skupině pak debuggery, které již v základní konfiguraci mají plnohodnotné grafické uživatelské rozhraní; některé historické debuggery typu Turbo Debugger pak i celoobrazovkové textové uživatelské rozhraní. Následně jsme se již věnovali stručnému popisu základních vlastností známého GNU Debuggeru (gdb), což je v současnosti s velkou pravděpodobností nejpoužívanější debugger na Linuxu (pokud se bavíme o debuggerech určených pro ladění nativních binárních aplikací). Tento debugger je při ladění nativních aplikací volán i z některých integrovaných vývojových prostředí: jedná se například o Eclipse CDT, Netbeans, KDevelop, Qt Creator či o dnes poněkud opomíjený Lazarus.
Obrázek 1: Na tomto screenshotu můžeme vidět průběh typického „sezení“ programátora využívajícího minule popsaný debugger gdb společně s cgdb při ladění jednoduché aplikace naprogramované v céčku. Nejprve je program přeložen do nativního kódu s vygenerováním ladicích informací (-g) a následně je spuštěn debugger s nadstavbou cgdb.
V některých případech však nemusí programátorům vyhovovat ani GNU Debugger ovládaný z příkazové řádky ani mnohdy zbytečně velké a komplikované integrované vývojové prostředí. V této chvíli přichází na řadu nadstavby nad GNU Debuggerem. Minule jsme se zmínili o velmi jednoduše použitelné nadstavbě nazvané cgdb, které používá celoobrazovkové textové uživatelské rozhraní. Dnes se budeme zabývat aplikací nazvanou Data Display Debugger neboli DDD (zcela korektně pak GNU DDD). Z dalšího popisu bude patrné, že tato aplikace je velmi jednoduše ovladatelná a její uživatelské rozhraní je poměrně přehledné, což mj. znamená, že může být užitečná i pro ty programátory, kteří se nechtějí učit mnohdy komplikované příkazy GNU Debuggeru. Navíc je Data Display Debugger navržen takovým způsobem, že ho lze použít i společně s dalšími debuggery, například pro ladění aplikací v Perlu, Pythonu či dokonce v BASHi.
Obrázek 2: Takto vypadá textové uživatelské rozhraní nástroje cgbd (popsaného minule) po spuštění. V horním okně můžeme vidět zdrojový kód se zeleně zvýrazněným aktivním řádkem, v dolní polovině terminálu se pak nachází rozhraní GNU Debuggeru.
2. Data Display Debugger (DDD)
První nadstavbou (nejenom) nad GNU Debuggerem je aplikace nazvaná Data Display Debugger neboli zkráceně DDD. Tato nadstavba nabízí uživatelům při ladění aplikací plnohodnotné grafické uživatelské rozhraní, jehož jednotlivé ovládací prvky sice mohou působit zastarale (což je způsobeno použitou GUI knihovnou), ve skutečnosti je však celé uživatelské rozhraní Data Display Debuggeru velmi flexibilní, což vynikne především při použití dvou a více monitorů. Příkladem flexibility GUI jsou například „odtrhávací“ menu (tear off menu), které je možné velmi snadno změnit na nemodální dialogy s nabídkou příkazů.
Obrázek 3: Spuštění Data Display Debuggeru. V základní konfiguraci je nastaveno, že se ihned po spuštění a inicializaci objeví poněkud otravný dialog Tip of the Day. Zobrazování tohoto dialogu je však možné vypnout v konfiguračním formuláři DDD.
DDD se používá, jak jsme si již naznačili v předchozí kapitole, společně s již zmíněným GNU Debuggerem, ovšem ve skutečnosti lze Data Display Debugger využít i pro komunikaci s dalšími debuggery, například s debuggerem jazyka Perl, debuggerem skriptů psaných v BASHi a v neposlední řadě taktéž pro ovládání pydb, což je jeden z debuggerů používaných vývojáři používajícími programovací jazyk Python (pro Python totiž existuje větší množství debuggerů).
Obrázek 4: Základní pohled na Data Display Debugger při ladění nativní aplikace. Největší plochu hlavního okna zabírá výpis zdrojového kódu, v dolní části se nachází terminál GNU Debuggeru. Nejdůležitější příkazy lze nalézt v samostatném toolbaru umístěného v pravé části tohoto snímku.
Instalace Data Display Debuggeru je na Fedoře velmi jednoduchá. Na Fedoře verze 20 a 21 se použije příkaz:
sudo yum install ddd
Na Fedoře 22 se pak namísto nástroje yum může použít dnf:
sudo dnf install ddd
Průběh instalace:
Last metadata expiration check performed 0:25:05 ago on Tue Jun 2 09:02:33 2015. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: ddd x86_64 3.3.12-20.fc22 fedora 1.6 M dejavu-sans-fonts noarch 2.34-4.fc22 fedora 1.5 M gc x86_64 7.4.2-2.fc22 fedora 104 k gd x86_64 2.1.1-2.fc22 fedora 145 k gdb x86_64 7.9.1-13.fc22 updates 2.9 M gnuplot x86_64 5.0.0-8.fc22 fedora 747 k gnuplot-common x86_64 5.0.0-8.fc22 fedora 602 k guile x86_64 5:2.0.11-4.fc22 fedora 3.9 M libXp x86_64 1.0.2-4.fc22 fedora 34 k libXv x86_64 1.0.10-2.fc22 fedora 22 k libXxf86dga x86_64 1.1.4-4.fc22 fedora 23 k libatomic_ops x86_64 7.4.2-4.fc22 fedora 31 k libbabeltrace x86_64 1.2.1-3.fc22 fedora 155 k libdmx x86_64 1.1.3-4.fc22 fedora 20 k libvpx x86_64 1.3.0-6.fc22 fedora 513 k motif x86_64 2.3.4-9.fc22 fedora 1.4 M xorg-x11-apps x86_64 7.7-13.fc22 fedora 309 k xorg-x11-fonts-ISO8859-1-100dpi noarch 7.5-14.fc22 fedora 1.1 M xorg-x11-fonts-ISO8859-1-75dpi noarch 7.5-14.fc22 fedora 933 k xorg-x11-fonts-misc noarch 7.5-14.fc22 fedora 5.8 M xorg-x11-utils x86_64 7.5-19.fc22 fedora 115 k xorg-x11-xbitmaps noarch 1.1.1-7.fc21 fedora 37 k Transaction Summary ================================================================================ Install 22 Packages Total download size: 22 M Installed size: 51 M Is this ok [y/N]:
Obrázek 5: Zobrazit je možné i disassemblovaný strojový kód nativní aplikace.
3. Použití Data Display Debuggeru společně s GNU Debuggerem
Jaké základní funkce Data Display Debugger nabízí? V první řadě se jedná o možnost spárování nativního (binárního) kódu se zdrojovým kódem, a to za předpokladu, že jsou k dispozici ladicí symboly, tj. v případě, že je program přeložen s použitím přepínače -g nebo jsou ladicí symboly doinstalovány. Dále lze do libovolného místa programu vložit breakpoint a definovat u každého breakpointu podmínku, po jejímž splnění se breakpoint aktivuje. K dispozici je taktéž disassembler, tj. modul překládající strojové instrukce do symbolického (čitelného) tvaru. Zapomenout samozřejmě nesmíme ani na podporu krokování programu po instrukcích, programových řádcích atd., ovšem nejužitečnější funkce nabízí Data Display Debugger při prohlížení datových struktur používaných programem – ostatně právě odtud získal Data Display Debugger svoje jméno. Způsobu zobrazení mnohdy i velmi komplikovaných datových struktur bude věnována samostatná kapitola, v níž si ukážeme, jakým způsobem je možné prozkoumat obsah binárního stromu. Další užitečné vlastnosti jsou ukázány na sérii screenshotů:
Obrázek 6: Pokud se nastaví breakpointy, jsou viditelné jak ve zdrojovém kódu (pokud je samozřejmě k dispozici), tak i v okně s disassemblovaným strojovým kódem.
Obrázek 7: V průběhu ladění nativních aplikací může být užitečné si zobrazit obsahy všech pracovních registrů mikroprocesoru. I tuto možnost Data Display Debugger samozřejmě programátorům nabízí.
Obrázek 8: Mnohé aplikace reagují na zaslané signály. V tomto dialogu je možné zvolit, jakým způsobem se bude s jednotlivými signály pracovat a taktéž je možné zvolený signál laděné aplikaci skutečně poslat.
Obrázek 9: Důležitý dialog, v němž je možné dopodrobna nastavit chování Data Display Debuggeru.
Obrázek 10: Změna nastavení GUI: ikony jsou barevné a tlačítka s ikonami plastická (aneb cesta zpět do devadesátých let :-).
Obrázek 11: Jakékoli menu je možné „odtrhnout“ a vytvořit z něho toolbar, který je možné umístit například na plochu druhého monitoru atd.
4. Prohlížení složitějších datových struktur
„Seeing is believing when it comes to tracking errors.“
Při ladění prakticky jakékoli složitější aplikace je nutné sledovat jak vlastní programový kód (ať již na úrovni zdrojového programového kódu či na úrovni assembleru, tj. jednotlivých strojových instrukcí), tak i datové struktury používané tímto kódem. Tyto struktury mohou být velmi komplikované, zejména pak ve chvíli, kdy je laděn program vytvořený v C či C++, kdy je mnohdy nutné používat lineárně vázané seznamy, různé typy stromů, pole struktur atd. Právě z tohoto důvodu dostala aplikace Data Display Debugger svoje jméno, protože prohlížení a analýza dat je zde poměrně propracovaná, což si ostatně ukážeme i na několika screenshotech zobrazených v této kapitole.
Obrázek 12: Zobrazení několika prvků binárního stromu v Data Display Debuggeru. Povšimněte si, jakým způsobem se pracuje s ukazateli nastavenými na hodnotu NULL.
V průběhu ladění aplikace je možné kurzorem myši vybrat jakoukoli globální či lokální proměnnou a z kontextového menu zvolit příkaz Display, který tuto proměnnou přidá do zvláštního podokna. U jednoduchých proměnných je zobrazena hodnota proměnné, pokud se však jedná o strukturu obsahující ukazatel, lze – opět s využitím kurzoru myši – zobrazit i navazující datové struktury, například další uzly stromu, prvky lineárně vázaného seznamu apod. Informace o každém uzlu či o každé proměnné je umístěna v obdélníku, kterým lze pohybovat. Jednotlivé vazby (v kontextu jazyků C a C++ ukazatele) se zobrazují pomocí šipky.
Obrázek 13: Alternativní pohled na data, se kterými aplikace
pracuje.
Pro zajímavost: na screenshotech číslo 13 až 15 byl laděn program obsahující následující kód pocházející ze skutečné aplikace:
typedef struct node { struct node *left; /* left subnode */ struct node *right; /* right subnode */ char *test_name; /* test name is stored as subnode value */ result *results; /* linked list with test results, day after date */ } node; /* * Root of the tree. */ node *root = NULL; /* * Insert new node containing just a test name into the tree. */ static void insert_new_node(node **root, char *test_name) { /* tree is not yet created */ if (*root == NULL) { *root = (node *)malloc(sizeof(node)); /* copy is needed here because strings returned by JVM TI functions needs * to be dealocated ASAP */ (*root)->test_name = (char*)calloc(strlen(test_name)+1, sizeof(char)); strcpy((*root)->test_name, test_name); (*root)->left = NULL; (*root)->right = NULL; (*root)->results = NULL; return; } /* tree is created, insert new node to the right place */ int cmp = strcmp(test_name, (*root)->test_name); if (cmp < 0) { insert_new_node(&(*root)->left, test_name); } else if (cmp > 0) { insert_new_node(&(*root)->right, test_name); } } /* * Insert new test result into a tree to the right node. */ static void insert(node **root, char *test_name, char *test_result) { insert_new_node(root, test_name); } static void test_tree_structure(void) { insert(&root, "B", "b1"); insert(&root, "A", "a1"); insert(&root, "C", "b2"); insert(&root, "D", "a2"); insert(&root, "E", "z1"); insert(&root, "F", "z2"); insert(&root, "G", "z3"); insert(&root, "H", "last"); insert(&root, "A", "last"); insert(&root, "Z", "last"); insert(&root, "C", "last"); insert(&root, "D", "last"); insert(&root, "E", "last2"); insert(&root, "C", "last3"); insert(&root, "AAA", "xxxx"); }
Obrázek 14: Pohled na jinak zkonstruovaný binární strom při ladění aplikace.
Obrázek 15: Jednotlivými uzly je možné pomocí myši pohybovat, což může být výhodné při zkoumání komplikovanějších datových struktur.
5. Použití Data Display Debuggeru společně s Python Debuggerem
Aplikace Data Display Debugger nemusí být použita pouze pro uživatelsky přívětivé ovládání GNU Debuggeru, protože její možnosti jsou podstatně větší. Dnešní verze DDD dokáže komunikovat i s dalšími typy ladicích nástrojů ovládaných z příkazové řádky. Jedná se zejména o debugger používaný pro ladění skriptů napsaných v programovacím jazyku Perl, další debugger určený pro aplikace napsané v Pythonu a dokonce je možné přímo z grafického uživatelského rozhraní Data Display Debuggeru ovládat debugger skriptů naprogramovaných v BASHi. Nejprve si popišme způsob propojení Data Display Debuggeru s debuggerem aplikací naprogramovaných v Pythonu. V současnosti se sice používá větší počet debuggerů pro Python, které jsou ovládané buď z příkazové řádky nebo pomocí nabízeného API, ovšem Data Display Debuggeru oficiálně podporuje základní debugger nazvaný pdb a taktéž pydb neboli „enhanced Python debugger“, který může být ovládaný z příkazové řádky, podobně jako GNU Debugger.
Obrázek 16: Data Display Debugger při ladění aplikace naprogramované v Pythonu.
Aby bylo možné ladit aplikace napsané v Pythonu s využitím Data Display Debuggeru, je nutné nejprve nainstalovat pdb, což se na Fedoře 20 a 21 provede následujícím způsobem:
sudo yum install pydb
Na Fedoře 22 pak takto:
sudo dnf install pydb
Průběh instalace:
Last metadata expiration check performed 0:35:50 ago on Tue Jun 2 09:02:33 2015. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: pydb noarch 1.26-12.fc21 fedora 203 k Transaction Summary ================================================================================ Install 1 Package Total download size: 203 k Installed size: 823 k Is this ok [y/N]:
Obrázek 17: Zobrazení lokálních proměnných v Data Display Debuggeru.
Data Display Debugger je v tomto případě možné spustit takto:
ddd název_skriptu.py
Po spuštění DDD by se měl zobrazit zdrojový kód laděného skriptu a většina příkazů (run, next, step) by měla pracovat prakticky stejným způsobem, s jakým jsme se již seznámili v předchozích kapitolách.
Obrázek 18: DDD nabízí několik konfiguračních voleb ovlivňujících kooperaci s pydb.
6. Použití Data Display Debuggeru společně s BASH Debuggerem
Druhým zajímavým a pro mnohé vývojáře i užitečným debuggerem, který je možné ovládat přímo z grafického uživatelského rozhraní Data Display Debuggeru, je debugger určený pro ladění skriptů naprogramovaných v BASHi. Podívejme se nyní na způsob propojení DDD s tímto debuggerem. Nejprve je nutné nainstalovat BASH debugger, podobně jako tomu bylo u Python debuggeru.
Obrázek 19: Laděná aplikace napsaná v BASHi.
Instalace na Fedoře 20 a 21:
sudo yum install bashdb
Instalace na Fedoře 22:
sudo dnf install bashdb
Průběh instalace:
Last metadata expiration check performed 0:49:30 ago on Tue Jun 2 09:02:33 2015. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: bashdb noarch 4.3_0.9-1.fc22 fedora 227 k Transaction Summary ================================================================================ Install 1 Package Total download size: 227 k Installed size: 717 k Is this ok [y/N]:
Obrázek 20: Spuštění laděné aplikace přímo v řádkovém debuggeru BASHe.
Spuštění Data Display Debuggeru je podobné, jako při ladění aplikací naprogramovaných v Pythonu:
ddd script.sh
popř.:
ddd --bash script.sh
Obrázek 21: Data Display Debugger a BASHdb.
Pokud DDD nahlásí chybové hlášení o tom, že BASH nelze spustit, je možné vyzkoušet tento příkaz:
ddd --debugger /usr/bin/bashdb -- script.sh (parametry)
Obrázek 22: Data Display Debugger a BASHdb.
7. Další debuggery podporované DDD
Mezi další řádkové debuggery, které je možné ovládat přímo z Data Display Debuggeru, patří i ladicí nástroj určený pro skripty naprogramované v Perlu. Tento debugger je již na Fedoře nainstalovaný společně s interpretrem Perlu, proto ho je možné ihned použít, což je ostatně patrné i při pohledu na screenshoty s laděným skriptem (mimochodem: jedná se o zajímavý skript, který zobrazí všechny barvy dostupné na použitém terminálu).
Obrázek 23: Data Display Debugger a debugger Perlu.
Obrázek 24: Data Display Debugger a debugger Perlu.
8. Obsah třetí části článku
Ve třetí části článku o debuggerech a jejich nadstavbách se budeme zabývat pravděpodobně nejpropracovanější nadstavbou nad GNU Debuggerem. Jedná se o nástroj nazvaný KDbg. Taktéž se zmíníme o nástroji Nemiver, který může v některých případech KDbg nahradit (v tomto případě však do značné míry záleží i na preferencích uživatelů).
9. Odkazy na Internetu
- Debuggery a jejich nadstavby v Linuxu (1.část)
http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu/ - Data Display Debugger
https://www.gnu.org/software/ddd/ - GDB - Dokumentace
http://sourceware.org/gdb/current/onlinedocs/gdb/ - BASH Debugger
http://bashdb.sourceforge.net/ - The Perl Debugger(s)
http://debugger.perl.org/ - Visual Debugging with DDD
http://www.drdobbs.com/tools/visual-debugging-with-ddd/184404519 - Pydb - Extended Python Debugger
http://bashdb.sourceforge.net/pydb/ - Insight
http://www.sourceware.org/insight/ - Supported Languages (GNU Debugger)
http://sourceware.org/gdb/current/onlinedocs/gdb/Supported-Languages.html#Supported-Languages - GNU Debugger (Wikipedia)
https://en.wikipedia.org/wiki/GNU_Debugger - The LLDB Debugger
http://lldb.llvm.org/ - Debugger (Wikipedia)
https://en.wikipedia.org/wiki/Debugger - 13 Linux Debuggers for C++ Reviewed
http://www.drdobbs.com/testing/13-linux-debuggers-for-c-reviewed/240156817 - Clewn
http://clewn.sourceforge.net/ - Clewn installation
http://clewn.sourceforge.net/install.html - Clewn - soubory ke stažení
http://sourceforge.net/projects/clewn/files/OldFiles/ - Pyclewn installation notes
http://pyclewn.sourceforge.net/install.html
4. 6. 2015 at 07:12
Kdysi jsem DDD používal a doteď jsem nevěděl, že toho umí tolik. Ale: to že používá historický Motif by ani tak nevadilo, ale to, že se o projekt prakticky nikdo nestará je už horší. Poslední verze DDD vyšla v roce 2009 – před více než šesti lety, bug tracker je plný hlášení, o která se nikdo nestará…
7. 6. 2015 at 20:12
To je bohužel pravda a týká se to i některých dalších nástrojů, které možná z dnešního pohledu nejsou dostatečně „cool“. Nicméně i přesto si myslím, že DDD svoji práci odvede – hlavně u nativních aplikací (napojení na Perl/Python/BASH je trošku problematické)
11. 6. 2015 at 20:46
ddd je (bol) super, spomenul som si, ako som pomocou neho ladil prve CGI scripty pisane v C na mojej AMD DX4-100/16MB RAM pracovnej stanici s prehistorickym redhatom 5 ktoreho instalacne diskety (alebo to bolo na diskety rozdelene instalacne cd?) sme tahali pomocou mailftp niekedy roku 1994 (1995?). Sialeny telefonny ucet nam v skole vtedy nejako odpustili. 😉
Nevedel som, ze ddd ma take pekne vizualizacie dynamickych datovych struktur. Internet bol vtedy velmi obmedzeny, za clanky ako je tento by som vtedy dal vela penazi.
12. 6. 2015 at 14:33
V době 486 to asi DDD ještě neuměl, ale on asi málokdy pouštěl GUI nadstavby (já měl 486 se 4MB, tam sice valil RH s FVWM95, terminály a Vimem, ale to bylo tak všechno, co to zvládlo 🙂