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

8. Obsah třetí části článku

9. Odkazy na Internetu

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.

13_cgdb1

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.

14_cgdb2

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ů.

03

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ů).

04

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]: 

05

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ů:

06

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.

07

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í.

08

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.

09

Obrázek 9: Důležitý dialog, v němž je možné dopodrobna nastavit chování Data Display Debuggeru.

10

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 :-).

11

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.

12

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.

13

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");
}

14

Obrázek 14: Pohled na jinak zkonstruovaný binární strom při ladění aplikace.

15

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.

16

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]: 

17

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.

18

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.

19

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]:

20

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

21

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)

22

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).

23

Obrázek 23: Data Display Debugger a debugger Perlu.

24

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

  1. Debuggery a jejich nadstavby v Linuxu (1.část)
    http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu/
  2. Data Display Debugger
    https://www.gnu.org/software/ddd/
  3. GDB - Dokumentace
    http://sourceware.org/gdb/current/onlinedocs/gdb/
  4. BASH Debugger
    http://bashdb.sourceforge.net/
  5. The Perl Debugger(s)
    http://debugger.perl.org/
  6. Visual Debugging with DDD
    http://www.drdobbs.com/tools/visual-debugging-with-ddd/184404519
  7. Pydb - Extended Python Debugger
    http://bashdb.sourceforge.net/pydb/
  8. Insight
    http://www.sourceware.org/insight/
  9. Supported Languages (GNU Debugger)
    http://sourceware.org/gdb/current/onlinedocs/gdb/Supported-Languages.html#Supported-Languages
  10. GNU Debugger (Wikipedia)
    https://en.wikipedia.org/wiki/GNU_Debugger
  11. The LLDB Debugger
    http://lldb.llvm.org/
  12. Debugger (Wikipedia)
    https://en.wikipedia.org/wiki/Debugger
  13. 13 Linux Debuggers for C++ Reviewed
    http://www.drdobbs.com/testing/13-linux-debuggers-for-c-reviewed/240156817
  14. Clewn
    http://clewn.sourceforge.net/
  15. Clewn installation
    http://clewn.sourceforge.net/install.html
  16. Clewn - soubory ke stažení
    http://sourceforge.net/projects/clewn/files/OldFiles/
  17. Pyclewn installation notes
    http://pyclewn.sourceforge.net/install.html