Ve čtvrté a současně i předposlední části článku o debuggerech dostupných programátorům v Linuxu si popíšeme debugger (resp. přesněji řečeno nadstavbu pro GNU Debugger) nazvaný KDbg. Jak již název této aplikace napovídá, jedná se o nástroj určený primárně pro prostředí KDE, ovšem samozřejmě ho lze používat například i v GNOME Shellu.

Obsah

1. Aplikace KDbg

2. Instalace nástroje KDbg

3. Ladění programů: nastavení breakpointů a krokování

4. Výpis zásobníku a hodnot lokálních proměnných

5. Výpis hodnot uložených do pracovních registrů

6. Obsah vybraného regionu operační paměti

7. Prohlížení komplikovanějších datových struktur

8. Porovnání vlastností nadstaveb nad GNU Debuggerem: DDD, Nemiver a KDbg

9. Odkazy na Internetu

1. Aplikace KDbg

Další zajímavou a současně i užitečnou nadstavbou nad debuggerem GNU Debugger (ovládaným z příkazové řádky) je nástroj pojmenovaný jednoduše KDbg. Již počáteční písmeno v názvu této aplikace trošku napovídá, že se jedná o nástroj určený primárně pro desktopové prostředí KDE, ve skutečnosti je však samozřejmě možné KDbg použít i v GNOME Shellu či na desktopu, na němž se používá nějaký „alternativní“ správce oken (Fluxbox atd.). KDbg vývojářům nabízí prakticky veškeré základní funkce, které jsou od debuggerů očekávány: nastavování breakpointů, nastavování watchpointů, krokování po jednotlivých příkazech, vstup do volaných funkcí, prohlížení obsahu operační paměti, prohlížení složitějších datových struktur apod. Již v úvodní větě jsme si řekli, že KDbg je ve skutečnosti nadstavbou nad klasickým GNU Debuggerem, což mj. znamená, že KDbg je možné v současné verzi použít pro ladění nativních aplikací naprogramovaných v jazycích Ada, C, C++, Go, Objective-C, D, Fortran, Modula-2, Pascal a Java (zde ovšem pouze při překladu do nativního strojového kódu). Nejpoužívanějšími jazyky laděných aplikací pravděpodobně zůstanou C a C++.

01

Obrázek 1: Grafické uživatelské rozhraní aplikace KDbg po spuštění.

Před dalším popisem aplikace KDbg je nutné se zmínit o tom, že tento nástroj ve své současné verzi neobsahuje všechny funkce, s nimiž jsme se seznámili v souvislosti s dnes již poněkud postarším ale v několika ohledech stále nepřekonaným Data Display Debuggerem (DDD). Především – alespoň prozatím – neexistují pluginy, které by dokázaly KDbg propojit s dalšími typy řádkových debuggerů, například s debuggerem pro programovací jazyky Python, Perl či BASH. Na druhou stranu je však možné přímo v grafickém uživatelském prostředí KDbg ladit „skripty“ napsané v jazyku XSLT (Extensible Stylesheet Language Transformations), což může být v mnoha případech velmi užitečné. V navazujících kapitolách se budeme zabývat primárně laděním aplikací přeložených do nativního strojového kódu, tj. vlastně těmi vlastnostmi nástroje KDbg, které do značné míry závisí na možnostech interně volaného GNU Debuggeru.

02

Obrázek 2: Informace o licenci, autorech atd.

2. Instalace nástroje KDbg

Instalace nástroje KDbg je na systému Fedora snadná, ostatně podobně jako tomu bylo i u dříve popisovaných nástrojů DDD či Nemiver. Na Fedoře verze 20 a 21 se použije příkaz:

sudo yum install kdbg

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 kdbg

V případě, že používáte výchozí desktopové prostředí Fedory založené na GNOME Shellu, může instalace nástroje KDbg trval poněkud déle, a to z toho prostého důvodu, že se bude instalovat relativně velké množství knihoven pro Qt a KDE. Ostatně podívejme se na konkrétní příklad počítače používaného mj. i pro vývoj, na němž prozatím nebyly knihovny pro KDE nainstalovány:

sudo yum install kdbg
Loaded plugins: langpacks, priorities, refresh-packagekit
243 packages excluded due to repository priority protections
Resolving Dependencies
-->gc Running transaction check
--->gc Package kdbg.x86_64 1:2.5.4-1.fc20 will be installed
-->gc Processing Dependency: libkio.so.5()(64bit) for package: 1:kdbg-2.5.4-1.fc20.x86_64
-->gc Processing Dependency: libkdeui.so.5()(64bit) for package: 1:kdbg-2.5.4-1.fc20.x86_64
-->gc Processing Dependency: libkdecore.so.5()(64bit) for package: 1:kdbg-2.5.4-1.fc20.x86_64
-->gc Running transaction check
--->gc Package kdelibs.x86_64 6:4.14.7-4.fc20 will be installed
-->gc Processing Dependency: kdelibs-common = 6:4.14.7-4.fc20 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: kde4-macros(api) = 2 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: strigi-libs(x86-64) >gc= 0.7.8 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: soprano(x86-64) >gc= 2.9.4 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: shared-desktop-ontologies >gc= 0.11.0 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: phonon(x86-64) >gc= 4.7.2 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: kde-filesystem >gc= 4-23 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: dbusmenu-qt(x86-64) >gc= 0.9.2 for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: kde-settings for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: kde-l10n for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libstreams.so.0()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libstreamanalyzer.so.0()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libsopranoclient.so.1()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libsoprano.so.4()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libqca.so.2()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libpolkit-qt-core-1.so.1()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libphonon.so.4()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libktexteditor.so.4()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libkdewebkit.so.5()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libfam.so.0()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libdbusmenu-qt.so.2()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libattica.so.0.4()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Processing Dependency: libHUpnp.so.1()(64bit) for package: 6:kdelibs-4.14.7-4.fc20.x86_64
-->gc Running transaction check

Počet instalovaných balíčků je poměrně velký:

Dependencies Resolved
===============================================================================================================
 Package                                   Arch             Version                    Repository         Size
===============================================================================================================
Installing:
 kdbg                                      x86_64           1:2.5.4-1.fc20             updates           316 k
Installing for dependencies:
 attica                                    x86_64           0.4.2-2.fc20               fedora            233 k
 dbusmenu-qt                               x86_64           0.9.2-5.fc20               fedora             86 k
 gamin                                     x86_64           0.1.10-15.fc20             fedora            128 k
 herqq                                     x86_64           1.0.0-6.fc20               fedora            353 k
 kate-part                                 x86_64           4.14.3-5.fc20              updates           1.7 M
 kde-filesystem                            x86_64           4-46.fc20                  fedora             48 k
 kde-l10n                                  noarch           4.14.3-1.fc20              updates            14 k
 kde-settings                              noarch           20-18.fc20                 updates            48 k
 kdelibs                                   x86_64           6:4.14.7-4.fc20            updates            11 M
 kdelibs-common                            x86_64           6:4.14.7-4.fc20            updates           1.9 M
 kdelibs-ktexteditor                       x86_64           6:4.14.7-4.fc20            updates            78 k
 kdelibs-webkit                            x86_64           6:4.14.7-4.fc20            updates            60 k
 libiodbc                                  x86_64           3.52.7-6.fc20              fedora            182 k
 libqzeitgeist                             x86_64           0.8.0-10.fc20              fedora             72 k
 phonon                                    x86_64           4.7.2-1.fc20.1             updates           221 k
 phonon-backend-gstreamer                  x86_64           2:4.7.2-1.fc20             updates           147 k
 polkit-qt                                 x86_64           0.112.0-1.fc20             updates            72 k
 qca2                                      x86_64           2.0.3-6.fc20               fedora            429 k
 qtsoap                                    x86_64           2.7-6.fc20                 fedora             75 k
 redland-virtuoso                          x86_64           1.0.16-4.fc20              fedora             29 k
 shared-desktop-ontologies                 noarch           0.11.0-2.fc20              fedora            113 k
 soprano                                   x86_64           2.9.4-2.fc20               fedora            613 k
 strigi-libs                               x86_64           0.7.8-2.fc20               fedora            458 k
 
Transaction Summary
===============================================================================================================
Install  1 Package (+23 Dependent packages)
 
Total download size: 19 M
Installed size: 65 M
Is this ok [y/d/N]: 

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

sudo apt-get install kdbg
Reading package lists... Done
Building dependency tree
Reading state information... Done
Recommended packages:
  gdb
The following NEW packages will be installed:
  kdbg
0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded.
Need to get 252 kB of archives.
After this operation, 1 184 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/universe kdbg amd64 2.5.4-1 [252 kB]
Fetched 252 kB in 1s (201 kB/s)
Selecting previously unselected package kdbg.
(Reading database ... 160357 files and directories currently installed.)
Preparing to unpack .../kdbg_2.5.4-1_amd64.deb ...
Unpacking kdbg (2.5.4-1) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for mime-support (3.54ubuntu1.1) ...
Processing triggers for gnome-menus (3.10.1-0ubuntu2) ...
Processing triggers for desktop-file-utils (0.22-1ubuntu1) ...
Setting up kdbg (2.5.4-1) ...

3. Ladění programů: nastavení breakpointů a krokování

Prakticky všechny základní pomůcky používané pro ladění aplikací, s nimiž jsme se seznámili v předchozích třech částech tohoto seriálu, samozřejmě nalezneme i v nástroji KDbg. Základem při ladění je propojení nativního (přeloženého) kódu se zdrojovým kódem, samozřejmě za předpokladu, že se při překladu aplikace použila volba -g. Ve chvíli, kdy dojde k načtení nativní aplikace do KDbg, pokusí se tento nástroj propojit laděnou aplikaci se zdrojovým kódem a použít čísla řádků uložená v nativní části pro zobrazování průběhu ladění i při nastavování breakpointů. V případě, že při ladění právě aktivní bod v programu „náhodně“ přeskakuje mezi zdrojovými řádky, znamená to, že se při překladu použila optimalizace (ostatně s ní budou mít problém i další debuggery a nadstavby nad nimi). Podpora breakpointů je v nástroji KDbg srovnatelná s již popsanými nástroji: u každého breakpointu je možné nastavit podmínku, počet průchodů atd.

03

Obrázek 3: Laděný program bez nastaveného breakpointu podle očekávání zhavaroval na řádku číslo 5 (viz zpráva zobrazená v pravém dolním rohu). Aby bylo možné debuggerem odhalit, kde chyba vznikla, je nutné nastavit breakpoint před tento řádek.

04

Obrázek 4: Nastavení breakpointů. U každého breakpointu je v případě potřeby možné specifikovat podmínku pro zastavení popř. i počet průchodů bodem, na nějž je breakpoint nastaven.

4. Výpis zásobníku a hodnot lokálních proměnných

Nástroj KDbg dokáže přehledně zobrazit obsah zásobníku, resp. přesněji řečeno obsah zásobníkových rámců platných pro aktivní vlákno (ladění vícevláknových aplikací je ovšem funkční pouze v případě, že tuto funkci podporuje GNU Debugger!). Informace o zásobníkových rámcích je rozdělena do dvou podoken. V podoknu nazvaném Stack je možné sledovat pořadí volání funkcí a taktéž hodnoty předávaných parametrů. V podoknu nazvaném Locals naproti tomu můžeme vidět názvy a hodnoty všech lokálních proměnných a současně i názvy a hodnoty předávaných parametrů (jak nestatické lokální proměnné, tak i parametry se ostatně nachází ve stejném zásobníkovém rámci). Příklad použití těchto dvou podoken je možné vidět na screenshotu číslo 5. Funkce main je zde volána s parametry argc==1 a argv[0]==“/home/tester/a.out“ (cesta ke spuštěné aplikaci); v okně Locals je navíc ještě zobrazena hodnota lokální proměnné p, což je ukazatel explicitně inicializovaný na NULL.

05

Obrázek 5: Prohlížení obsahu zásobníku (podokno vlevo dole) a lokálních proměnných (podokno vpravo nahoře).

5. Výpis hodnot uložených do pracovních registrů

Další velmi užitečnou funkcí nástroje KDbg, o níž je vhodné se v tomto článku alespoň ve stručnosti zmínit, je funkce zajišťující zobrazení hodnot uložených do pracovních registrů mikroprocesoru (to má samozřejmě význam pouze při krokování aplikace či při jejím zastavení na breakpointu). KDbg detekuje typ mikroprocesoru, na němž je laděná aplikace spuštěna, a dokáže zobrazit obsah prakticky všech pracovních registrů mikroprocesoru i koprocesorů, tj. jak registrů používaných pro celočíselné operace, tak i příznakových a řídicích registrů (flags, machine status word atd.), deskriptorů či segmentových registrů, registrů matematického mikroprocesoru popř. i registrů používaných v různých rozšířeních instrukčních sad (SSE, SSE2, …). Pokud se v průběhu ladění obsah nějakého registru změní, dojde k jeho zvýraznění červenou barvou. Navíc se u registru IP (Instruction Pointer) může zobrazit jméno funkce a index právě zpracovávané instrukce (v rámci této funkce).

06

Obrázek 6: Prohlížení obsahu pracovních registrů: všechny celočíselné registry platformy x86_64.

07

Obrázek 7: Prohlížení obsahu pracovních registrů: příznakové registry a deskriptory segmentů (opět platné pro platformu x86_64).

08

Obrázek 8: Prohlížení obsahu pracovních registrů: všechny registry používané v rozšíření instrukční sady SSE.

6. Obsah vybraného regionu operační paměti

Podobně jako tomu bylo u minule popsaného nástroje Nemiver, dokáže i aplikace KDbg zobrazit obsah vybraného bloku operační paměti. Na listu Memory stačí do vstupního pole zadat adresu počáteční buňky sledovaného bloku paměti a z kontextového menu způsob interpretace dat uložených od zadané adresy. Jednotlivé bajty je možné sdružovat do vícebajtových slov a zobrazit tak celočíselné hodnoty typu byte/short int/int/long/long long, ovšem velmi užitečná je možnost interpretace bajtů jakoby se jednalo o hodnoty typu float či double (zde jsou možnosti KDbg větší, než u konkurenčního Nemiveru). Způsob použití zmíněné funkcionality můžeme vidět na sekvenci screenshotů zobrazených pod tímto odstavcem. Jedná se o ladění velmi jednoduché aplikace, která postupně naplní dvacetiprvkové pole typu float[], takže je nutné, aby debugger uměl interpretovat obsah tohoto pole vhodným způsobem.

09

Obrázek 9: Tento krátký program použijeme pro zjištění možností výpisu vybraného regionu operační paměti. V programu je deklarováno globální pole typu float[] s dvaceti prvky.

10

Obrázek 10: Výpis obsahu pole prvek po prvku (pravé dolní podokno nazvané Watches). Povšimněte si, že sledovaný výraz je jednoduchý – obsahuje pouze jméno pole.

11

Obrázek 11: Zjištění adresy pole pomocí operátoru & (pravé dolní podokno se zvýrazněným řádkem). Důležitá je hodnota 0x601060, kterou použijeme dále.

12

Obrázek 12: Obsah operační paměti od adresy 0x601060 je vypsán ve formátu reálných čísel typu float (levé dolní podokno).

7. Prohlížení komplikovanějších datových struktur

Při pohledu na screenshoty je patrné, že KDbg má poměrně velké množství vlastností společných s nadstavbou Nemiver. Prakticky totožné je chování těchto dvou nadstaveb nad GNU Debuggerem ve chvíli, kdy vývojář stojí před úkolem zobrazit obsah komplikovanějších datových struktur. KDbg používá pro zobrazení obsahu složitějších struktur (stromu, lineárně vázaného seznamu atd.) způsob zobrazení, který můžeme vidět na screenshotech číslo 13 až 15. 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 (viz popis Data Display Debuggeru), ovšem pro potřeby většiny aplikací by toto zobrazení mohlo být dostatečné. Podobným způsobem se zobrazuje i obsah polí, což jsme si již ostatně ukázali na screenshotu číslo 10 uvedeného v předchozí kapitole.

13

Obrázek 13: Program, který vytváří stromovou datovou strukturu.

14

Obrázek 14: Zobrazení kořenového uzlu stromové datové struktury.

15

Obrázek 15: Zobrazení dalších prvků stromové datové struktury.

8. Obsah poslední části seriálu

V páté a současně i v poslední části seriálu o debuggerech pro Linux si popíšeme způsob propojení debuggeru s editorem Emacs. Taktéž se stručně zmíníme o propojení debuggeru s konkurenčním editorem Vim. Na závěr budou všechny doposud popsané debuggery a jejich GUI nadstavby porovnány, a to jak z hlediska nabízené funkcionality, tak i z pohledu vývojářů, kteří většinou potřebují používat debugger bez toho, aby se museli zdlouhavě a složitě naučit jeho ovládání.

16

Obrázek 16: Libovolnou oblast paměti lze zpětně přeložit disassemblerem.

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