Ve třetí části článku o debuggerech dostupných programátorům v Linuxu se budeme zabývat další nadstavbou vytvořenou nad GNU Debuggerem. Tato nadstavba se jmenuje Nemiver a určena je především vývojářům pracujících v programovacích jazycích C a C++.

Obsah

1. Aplikace Nemiver

2. Instalace Nemiveru

3. We hate splash screens

4. Nastavení breakpointů, spuštění a krokování laděné aplikace

5. Ladění na úrovni assembleru

6. Sledování obsahu operační paměti

7. Prohlížení datových struktur použitých v laděné aplikaci

8. Co v Nemiveru nenajdeme

9. Odkazy na Internetu

1. Aplikace Nemiver

V předchozí části článku o debuggerech, které jsou dostupné vývojářům pracujícím s Linuxem, jsme se zabývali popisem nástroje Data Display Debugger neboli zkráceně DDD. Připomeňme si, že Data Display Debugger sice používá dnes již zastaralou knihovnu pro grafické uživatelské rozhraní a i vývoj DDD je dnes velmi pomalý, na druhou stranu se však jedná o vyspělou aplikaci, která programátorům nabízí rozhraní jak pro klasický GNU Debugger, tak i pro některé další debuggery používané například pro ladění aplikací v Perlu, Pythonu či v BASHi. Navíc nesmíme zapomenout na jednu velmi důležitou oblast, ve které Data Display Debugger exceluje – jedná se o možnost zobrazení i velmi složitých datových struktur, jakými jsou různé typy stromů či grafů.

01

Obrázek 1: Takto vypadá debugger Nemiver po spuštění.

Dnes si popíšeme další podobný nástroj, který se jmenuje Nemiver. Tento nástroj je navržen takovým způsobem, aby dobře zapadal do desktopového prostředí GNOME, ve skutečnosti ho však (pochopitelně) mohou používat i ti uživatelé, kteří preferují použití odlišného desktopového prostředí či namísto něho používají „jen“ správce oken; ostatně většina screenshotů v dnešním článku byla pořízena na počítači s Fluxboxem a nikoli s plnohodnotným prostředím GNOME.

02

Obrázek 2: Logo Nemiveru je skutečně zvláštní.

2. Instalace Nemiveru

Instalace aplikace Nemiver je na Fedoře velmi jednoduchá. Na Fedoře verze 20 a 21 se použije příkaz:

sudo yum install nemiver

Na Fedoře 22 se pak namísto nástroje yum může použít příkaz dnf (ovšem i příkaz yum je stále dostupný):

sudo dnf install nemiver

03

Obrázek 3: Průběh instalace Nemiveru na Fedoře verze 21.

Na distribucích založených na balíčcích .deb lze pro instalaci Nemiveru použít například utilitu apt-get:

sudo apt-get install nemiver
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  gdb
Suggested packages:
  gdb-doc gdbserver
Recommended packages:
  libc-dbg
The following NEW packages will be installed:
  gdb nemiver
0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded.
Need to get 5 608 kB of archives.
After this operation, 30,1 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
...
...
...
Setting up gdb (7.7.1-0ubuntu5~14.04.2) ...
Setting up nemiver (0.9.5-2) ...

04

Obrázek 4: Nemiver je možné na Debianu/Ubuntu/MINTu nainstalovat i přes nástroj Synaptic atd.

3. We hate splash screens

Název této kapitoly poměrně přesně vystihuje, jakou filozofií se řídili autoři debuggeru Nemiver: KISS. Tato aplikace se totiž snaží o použití přehledného a přitom snadno ovladatelného grafického uživatelského rozhraní, takže zde nalezneme jen několik dialogů (nejsložitějším dialogem je dialog Preferences), hlavní okno Nemiveru není přeplácáno mnoha ovládacími prvky a i samotný nástrojový pruh obsahuje pouze několik základních příkazů používaných při ladění. To ovšem neznamená, že by Nemiver své uživatele ochuzoval o základní funkce, o nichž jsme se zmínili při popisu GNU Debuggeru: Nemiver umožňuje krokování programu na úrovni zdrojového kódu či assembleru, je možné nastavovat breakpointy, sledovat hodnotu libovolné lokální či globální proměnné, připojit se k běžícímu procesu a díky použití gdbserveru je dokonce možné, aby se Nemiver připojil k aplikaci běžící na vzdáleném počítači. Užitečné je, že pro obarvení zdrojových kódů se používá stejný subsystém, jaký využívá textový editor Gedit (autoři se v této oblasti nesnažili znovuobjevit kolo, mimochodem pro zobrazení zdrojového kódu v aplikaci Nemiver se interně používá knihovna nazvaná gtksourceviewmm3).

05

Obrázek 5: Prostředí aplikace Nemiver je skutečně přehledné a jednoduše použitelné.

Velmi užitečnou vlastností je podpora takzvaných „sezení“ (session). Kdykoli je Nemiver ukončen, zapamatuje si, která aplikace byla laděna, na kterých řádcích byly nastaveny breakpointy atd. K ladění této aplikace se lze kdykoli k budoucnu vrátit a to bez nutnosti explicitně vytvářet projekty či se nějak dále o uložená sezení starat. Mimochodem – veškerá nastavení naleznete v souboru ~/.nemiver/nemivercommon.db a jak již koncovka tohoto souboru napovídá, jedná se o SQLite databázi (obsah této databáze je jednoduché exportovat do textového souboru, takže uživatelé nemusí nutně ztratit všechny výhody textových souborů a nástrojů pro jejich zpracování).

06

Obrázek 6: Velmi užitečná vlastnost – Nemiver si ukládá informace o předchozích „sezeních“ a dovolí se k těmto sezením kdykoli v budoucnu vrátit. Není přitom zapotřebí vytvářet žádné projekty ani explicitně ukládat nastavení.

4. Nastavení breakpointů, spuštění a krokování laděné aplikace

Nemiver podporuje čtyři základní způsoby, jakými je možné začít ladit aplikaci. Buď je možné otevřít nativní soubor či knihovnu s aplikací a pokud byl překlad proveden s volbou -g, načte se do Nemiveru i příslušný zdrojový kód. Alternativně je možné se připojit k běžící aplikaci, připojit se ke vzdáleně běžící aplikaci popř. otevřít tzv. core dump, který je vygenerován ve chvíli pádu laděné aplikace (ovšem pouze v tom případě, že je systém korektně nastaven – soubory core dumpu jsou totiž obecně dosti rozsáhlé, protože mj. obsahují i kopii paměti přidělené procesu.

07

Obrázek 7: Nastavení breakpointu ve zdrojovém kódu laděné aplikace. V dolní části okna Nemiveru můžeme vidět aktuální hodnoty lokálních proměnných.

Nezávisle na způsobu zahájení ladění nabízí Nemiver jak společné GUI prvky (toolbar, menu), tak i klávesové zkratky používané při ladění. Význam těchto klávesových zkratek je vypsán v následující tabulce (některé klávesové zkratky pravděpodobně budete znát i z dalších vývojových nástrojů):

# Zkratka Význam
1 Shift+F5 spuštění laděné aplikace
2 F5 znovuspuštění aplikace (konec krokování)
3 F11 spuštění aplikace a zastavení na místě, kde se nachází kurzor
4 F9 zastavení aplikace
5 F8 nastavení breakpointu či naopak vymazání breakpointu
6 Ctrl+B nastavení breakpointu
7 Ctrl+T nastavení watchpointu
8 F6 přechod na další příkaz při krokování
9 F7 dtto ale se vstupem do funkce
10 Shift+F7 výstup z funkce

08

Obrázek 8: Způsob nastavení breakpointů je ukázán ve vestavěné nápovědě (která využívá stejný systém nápovědy jako mnohé další aplikace pro desktopové prostředí Gnome).

Užitečná je především klávesová zkratka F8 popř. Ctrl+B používaná pro nastavení breakpointů. Vytvořit je možné jednoduchý breakpoint popř. breakpoint aplikovaný až ve chvíli, kdy dojde ke splnění zadané podmínky nebo až dojde k vícenásobnému zavolání funkce či programové smyčky (počet volání nebo průchodů smyčkou je možné zapsat do příslušného dialogu). Podobným způsobem se nastavují watchpointy, pro něž je samozřejmě možné nastavit, zda se mají vyvolat při čtení hodnoty vybrané proměnné či naopak při zápisu do proměnné (popř. při čtení a taktéž při zápisu).

09

Obrázek 9: Dialog s volbou, kam se má přenést řízení laděné aplikace.

5. Ladění na úrovni assembleru

Nemiver umožňuje, podobně jako je tomu v případě mnoha dalších debuggerů a nadstaveb nad debuggery, zobrazit kromě zdrojového kódu i disassemblovaný kód, čehož je možné využít jak při zkoumání vlastností překladače, tak i při hledání některých dobře ukrytých chyb :-). Při přepnutí do režimu disassembleru, které se provádí z menu popř. klávesovou zkratkou Ctrl+A, se změní i systém krokování, protože to se již neprovádí na úrovni jednotlivých příkazů příslušného vyššího programovacího jazyka, ale naopak na úrovni jednotlivých strojových instrukcí. Při krokování je možné si zobrazit obsah všech pracovních registrů mikroprocesoru a sledovat jejich změnu: registr, jehož obsah se změnil, se zvýrazní červenou barvou. Užitečné je, že Nemiver dokáže zobrazit jak celočíselné registry a segmentové registry, tak i registry matematického koprocesoru i registry používané v různých rozšířeních instrukčních sad (XMM atd.). Díky tomu je možné ladit i ty aplikace, které jsou přeloženy s příslušnými přepínači, například -mmmx, -msse, -msse2, -msse3, -mssse3, -msse4.1, -msse4.2, -msse4 či -mavx.

16

Obrázek 10: Takto vypadá část kódu funkce main při použití disassembleru.

6. Sledování obsahu operační paměti

V některých případech je při hledání chyb důležité si prohlédnout obsah vybrané oblasti operační paměti přidělené aplikaci. I tuto funkci Nemiver, obsahuje, musíme se ovšem smířit s některými omezeními. Obsah paměti od specifikované adresy je zobrazen ve formátu používaném například historickými programy typu monitor, tj. jedná se o třísloupcový výpis, kde v prvním sloupci jsou zobrazeny adresy začátku řádku, následuje výpis obsahu buněk operační paměti (seskupený do bajtů či vícebajtových slov) a ve sloupci posledním pak nalezneme znaky odpovídající jednotlivým bajtům. Bohužel však není možné si vybrané bajty zobrazit ve formátu používaném matematickým koprocesorem, takže například „pohled“ na pole hodnot typu float či double je dosti problematický. To stejné platí při snaze o zobrazení vybrané oblasti paměti ve formě řetězce uloženého s použitím UTF-8 či UTF-16.

10

Obrázek 11: Sledování obsahu operační paměti.

11

Obrázek 12: Sledování obsahu operační paměti.

7. Prohlížení datových struktur použitých v laděné aplikaci

Minule jsme se seznámili s propracovanými možnostmi Data Display Debuggeru při zobrazování složitých datových struktur, například (binárních) stromů či grafů. Data Display Debugger mohl v případě potřeby tyto struktury zobrazit graficky – každý prvek struktury byl představován obdélníkem, šipky mezi obdélníky pak naznačovaly použití ukazatelů (pointerů). Dnes popisovaná aplikace Nemiver používá pro zobrazení obsahu jednoduchých proměnných ale i složitějších struktur poněkud jiný způsob zobrazení, který můžeme vidět na screenshotech číslo 12 a 13. Na těchto obrázcích lze vidět GUI widget používaný v jiných aplikacích pro zobrazení stromové struktury, která sice není tak obecná jako orientované či neorientované grafy, ovšem pro potřeby většiny aplikací by toto zobrazení mohlo být dostatečné. S využitím myši a ikon šipek lze jednotlivé uzly grafu zobrazit či naopak skrýt. Na screenshotu číslo 14 pak můžeme vidět způsob zobrazení obsahu jednorozměrného a dvourozměrného pole (což je samozřejmě taktéž velmi užitečné).

12

Obrázek 13: Zobrazení kořenového elementu binárního stromu.

13

Obrázek 14: „Rozbalení“dalších elementů binárního stromu.

14

Obrázek 15: Způsob zobrazení obsahu jednorozměrného a dvourozměrného pole.

8. Co v Nemiveru nenajdeme

Z předchozích kapitol je pravděpodobně patrné, že Nemiver může být pro mnoho vývojářů velmi užitečným a současně i snadno použitelným nástrojem, jehož ovládání se lze naučit doslova za několik minut. Ovšem na tomto místě je nutné dodat, že některé funkce programátorům a testerům v současné verzi nenabízí. Pokud Nemiver porovnáme s minule popsaným Data Display Debuggerem, zjistíme, že například není možné propojit Nemiver s dalšími debuggery určenými pro ladění aplikací naprogramovaných v Pythonu, Perlu či BASHi (v mnoha případech by se hodilo i propojení s řádkovým debuggerem Javy).

14

Obrázek 16: Nemiver používá stejný systém (topic-based) nápovědy jako mnoho dalších aplikací z prostředí Gnome.

Taktéž možnosti zobrazení datových struktur jsou v porovnání s Data Display Debuggerem poněkud menší a některé možnosti GNU Debuggeru nejsou přímo z grafického uživatelského rozhraní Nemiveru dostupné vůbec. Jedná se například o možnost nastavení watchpointů – s těmi je sice možné pracovat (viz též předchozí kapitoly), ale některé nízkoúrovňové operace lze nastavit jen přímo v GNU Debuggeru.

15

Obrázek 17: V dolní polovině okna můžeme vidět zobrazení obsahu pracovních registrů mikroprocesoru.

9. Odkazy na Internetu

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