Pátá a současně i poslední část miniseriálu o debuggerech dostupných programátorům v Linuxu je věnována popisu propojení populárních textových editorů Emacs a Vim s debuggery, především pak s GNU Debuggerem. Toto propojení je v mnoha ohledech výhodné, protože programátoři mohou využívat známé uživatelské prostředí svých textových editorů a příkazy do GNU Debuggeru mohou zadávat pouze v odůvodněných případech.

Obsah

1. Propojení textových editorů s debuggery

2. Textový editor Emacs ve funkci integrovaného vývojového prostředí

3. Emacs a GNU Debugger

4. Spuštění debuggeru z prostředí Emacsu

5. Breakpointy, krokování a základní klávesové zkratky

6. Výpis obsahu bloku operační paměti a lokálních proměnných

7. Obsah pracovních registrů procesoru a disassembler

8. Textový editor Vim ve funkci integrovaného vývojového prostředí

9. Funkce Vimu, které jsou používané pluginy spolupracujícími s debuggery

10. Plugin Clewn zajišťující spolupráci s debuggery

11. Použití pluginu Clewn v praxi

12. Plugin Pyclewn

13. Předchozí části tohoto seriálu

14. Odkazy na Internetu

1. Propojení textových editorů s debuggery

V předchozích čtyřech částech seriálu o debuggerech dostupných pro Linux jsme se zabývali převážně popisem debuggerů ovládaných z příkazové řádky (s důrazem na GNU Debugger) a taktéž některými nadstavbami nad těmito debuggery. Tyto nadstavby, ať již vývojářům nabízely celoobrazovkové textové uživatelské rozhraní či plnohodnotné grafické uživatelské rozhraní (GUI), byly v podstatě jednoúčelovými nástroji, protože jejich mnohdy jedinou funkcí bylo zobrazení zdrojového kódu laděné aplikace, posílání příkazů debuggeru a zobrazení zpráv či dalších informací vracených debuggerem (obsah paměti, disassemblovaný kód, hodnoty sledovaných proměnných, stav zásobníku) zpět do nadstavbové aplikace.

07

Obrázek 1: Pro připomenutí: grafické uživatelské rozhraní Data Display Debuggeru popsané ve druhé části tohoto seriálu.

Na tom, že většina dříve popsaných aplikací (Data Display Debugger, Nemiver, KDbg) je zaměřena pouze na jednu činnost, samozřejmě není nic špatného a odpovídá to filozofii, na které jsou postaveny všechny unixové systémy. Nicméně někteří uživatelé preferují integraci uživatelského rozhraní debuggeru s dalšími vývojovými nástroji, ať již s plnohodnotnými IDE nebo s programátorskými textovými editory. Dnes se budeme zabývat právě druhou zmíněnou možností, tedy možným způsobům propojení debuggerů s textovými editory.

05

Obrázek 2: Další popsaná nadstavba nad GNU Debuggerem: prostředí aplikace Nemiver (třetí část seriálu).

04

Obrázek 3: Poslední již popsaná nadstavba nad GNU Debuggerem: prostředí aplikace KDbg (čtvrtá část seriálu).

2. Textový editor Emacs ve funkci integrovaného vývojového prostředí

Prvním programátorským textovým editorem nabízejícím propojení s GNU Debuggerem, popř. i s dalšími typy debuggerů, je slavný a stále oblíbený editor GNU Emacs (Editor MACroS), který poměrně nedávno dosáhl verze 24.5. Díky tomu, že je tento programátorský editor relativně snadno rozšiřitelný s využitím skriptů a modulů naprogramovaných v jazyce Lisp, přesněji řečeno v jeho dialektu nazvaném Emacs Lisp (též Elisp), existuje v současnosti poměrně velké množství propracovaných modulů, které z Emacsu vytváří sofistikované integrované vývojové prostředí (IDE), jež se navíc v případě potřeby dokáže přizpůsobit mnoha programovacím jazykům (překladačům i interpretrům).

04

Obrázek 4: Spuštění textového editoru Emacs se zobrazením hypertextového souboru s nápovědou.

Textový editor Emacs je možné v závislosti na tom, jaký typ souboru je právě otevřený, přepínat mezi různými režimy, přičemž v každém režimu mohou být použity jiné klávesové zkratky, zobrazena odlišná okna (nejenom klasická okna s editovaným textem) apod. V dnešním článku se budeme zabývat jediným režimem – laděním programů s využitím GNU Debuggeru. O propojení debuggeru s Emacsem se stará knihovna GUD neboli Grand Unified Debugger.

05

Obrázek 5: Inicializace knihovny GUD a připojení Emacsu ke GNU Debuggeru.

3. Emacs a GNU Debugger

Výše zmíněná knihovna Grand Unified Debugger mj. zajišťuje i propojení mezi textovým editorem GNU Emacs a debuggerem GNU Debugger. V tomto režimu je možné si v okně Emacsu zobrazit zdrojový kód a současně i několik bufferů obsahujících jak textové uživatelské rozhraní debuggeru (konzoli, která je aktivní, tj. lze do ní zapisovat příkazy), tak i speciální buffer s hodnotami pracovních registrů procesoru, další buffer se seznamem breakpointů, buffer se seznamem vláken atd. Kromě toho je možné (minimálně ve chvíli, kdy je Emacs spuštěn v prostředí grafického desktopu) otevřít další specializovaná okna, zejména okno s výpisem obsahu vybraných proměnných, obsahem bloku paměti, disassemblovaným kódem apod.

06

Obrázek 6: Nastavení breakpointu ve zdrojovém kódu laděné aplikace. Informace o nastaveném breakpointu se současně zobrazí i v interaktivním okně GNU Debuggeru.

Nabízené příkazy a operace jsou umístěny ve vlastním menu nazvaném Gud, některé příkazy mají vlastní klávesovou zkratku a ostatní příkazy lze zavolat i jako funkce Emacs Lispu (viz též navazující kapitoly). Důležité přitom je, že vývojář stále může zdrojový kód vyvíjené aplikace editovat, překládat, commitovat atd. bez nutnosti opuštění Emacsu (a tím pádem i debuggeru, jen je v některých případech nutné do něj znovu nahrát laděnou aplikaci). Celý vývojový cyklus se tak může poměrně výrazným způsobem urychlit.

07

Obrázek 7: Laděná aplikace podle očekávání havarovala na segmentation fault.

4. Spuštění debuggeru z prostředí Emacsu

V závislosti na typu debuggeru se pro jeho inicializaci použije některý z následujících příkazů:

Příkaz Význam
Alt+X gdb Spustí se GNU Debugger
Alt+X gud-gdb Spustí se taktéž GNU Debugger, ovšem s použitím speciálního bufferu
Alt+X perldb Spustí se interpret Perlu v režimu ladění
Alt+X jdb Spustí se debugger JVM (virtuální stroj Javy)
Alt+X pdb Spustí se debugger pro interpret Pythonu

08

Obrázek 8: V nápovědě k Emacsu je režim knihovny GUD popsán do všech podrobností.

Poznámka: v tomto článku budu používat názvy klávesových zkratek způsobem, který se většinou v návodech ani v nápovědě Emacsu nepoužívá: textový editor Emacs totiž z dnes již převážně historických důvodů namísto klávesy Alt používá M (Meta), podobně se namísto Ctrl či Control píše pouze C spojené pomlčkou s další současně stisknutou klávesou. To znamená, že například výše uvedená zkratka Alt+X gdb je v nápovědě k Emacsu zapsána následujícím způsobem: M-x gdb.

09

Obrázek 9: Spuštění GNU Debuggeru popsané v nápovědě k textovému editoru Emacs.

V nejjednodušším případě lze při ladění aplikace naprogramované v C, C++, Adě, Fortranu atd. postupovat následovně: otevře se zdrojový kód laděné aplikace (který je již přeložený s volbou -g), pomocí klávesové zkratky Ctrl+X 2 se rozdělí okno na dvě okna a v jednom z těchto oken se spustí příkaz Alt+X gdb. Ten se nejdříve zeptá na jméno nativního souboru, který se bude ladit (výchozí hodnota je a.out) a posléze se spustí interaktivní konzole GNU Debuggeru.

10

Obrázek 10: Dalším zajímavým režimem je režim ladění skriptů naprogramovaných v Elispu.

5. Breakpointy, krokování a základní klávesové zkratky

Spuštění laděného programu zajistí klávesová zkratka Ctrl+X Ctrl+A Ctrl+R, alternativně je možné použít i zkratku Ctrl+C Ctrl+R (viz poznámku pod odstavcem). Při krokování je nutné vkládat do laděného kódu na určitá místa breakpointy. V Emacsu s inicializovaným GUDem pro tento účel slouží klávesová zkratka Ctrl+X Ctrl+A Ctrl+B. Mezi další užitečné klávesové zkratky patří Ctrl+X Ctrl+A Ctrl+S či Ctrl+C Ctrl+S sloužící pro vykonání dalšího řádku, a to i v případě, že se na tomto řádku nachází volání funkce (v této situaci se debugger zastaví na začátku volané funkce). Pokud potřebujeme volanou funkci vykonat v jednom kroku (například většinou nemá smysl krokovat sáhodlouhou funkci printf), použije se klávesová zkratka Ctrl+X Ctrl+A Ctrl+N či Ctrl+C Ctrl+N. Krokování je ovšem možné provádět i na úrovni jednotlivých strojových instrukcí, k čemuž slouží klávesová zkratka Ctrl+X Ctrl+A Ctrl+I či Ctrl+C Ctrl+I.

11

Obrázek 11: Seznam nastavených breakpointů.

Proč se však u většiny příkazů objevují dvě klávesové zkratky? Delší zkratka začínající na Ctrl+X Ctrl+A je dostupná v Emacsu globálně, zatímco kratší zkratku začínající na Ctrl+C lze použít v bufferu GUDu:

Operace Globální zkratka Zkratka v GUDu
Run, continue Ctrl+X Ctrl+A Ctrl+R Ctrl+C Ctrl+R
next Single line Ctrl+X Ctrl+A Ctrl+S Ctrl+C Ctrl+S
Next line Ctrl+X Ctrl+A Ctrl+N Ctrl+C Ctrl+N
Next Instruction Ctrl+X Ctrl+A Ctrl+I Ctrl+C Ctrl+I
Breakpoint Ctrl+X Ctrl+A Ctrl+B

V tabulce jsou zvýrazněny i mnemotechnické pomůcky sloužící ke snadnějšímu zapamatování zkratek.

12

Obrázek 12: Nápověda ke GNU Debuggeru zobrazená v jeho interaktivní konzoli.

6. Výpis obsahu bloku operační paměti a lokálních proměnných

Po inicializaci GUDu je možné si v průběhu ladění aplikace zobrazit i další specializované buffery. Kromě bufferu či bufferů se zdrojovým kódem se jedná o již zmíněný buffer, v němž se zobrazují zprávy GNU Debuggeru popř. jiného spuštěného debuggeru. Mezi další specializované buffery patří:

Breakpoints Buffer
Threads Buffer
Stack Buffer
Locals Buffer
Registers Buffer
Assembler Buffer
Memory Buffer

13

Obrázek 13: Výpis obsahu vybraného bloku operační paměti.

Užitečný je Memory Buffer, v němž je možné si nechat zobrazit vybranou část operační paměti přiřazené laděnému procesu. Je možné volit různé formáty zobrazení, samozřejmě v závislosti na tom, jaká data jsou v paměti uložena (byte, int, long, float, double, struktury atd.). Druhým užitečným speciálním bufferem je Local Buffer zobrazující obsah lokálních proměnných s tím, že pokud dojde ke změně hodnoty některé z těchto proměnných, dojde k jejímu zvýraznění (například červenou barvou, v závislosti na nastavení Emacsu.

14

Obrázek 14: Dvojice proměnných – desetiprvkové pole a celočíselné počitadlo.

7. Obsah pracovních registrů procesoru a disassembler

Textový editor GNU Emacs dokáže při spolupráci s GNU Debuggerem zobrazit i mnoho dalších důležitých informací. Jedná se zejména o obsah pracovních registrů, přičemž se zobrazují jak normální celočíselné pracovní registry mikroprocesoru, tak i všechny další dostupné (viditelné) registry, tj. například registry matematického koprocesoru, registry rozšíření instrukční sady SSE apod. (zcela jiné registry se samozřejmě použijí na architektuře ARM či AArch64). Kromě toho si lze v průběhu ladění zobrazit i disassemblovaný nativní kód a jak jsme si již naznačili v předchozích kapitolách, lze laděnou aplikací krokovat po jednotlivých instrukcích, tj. nikoli po celých programových řádcích. Pro tento účel slouží klávesová zkratka Ctrl+C Ctrl+I popř. Ctrl+X Ctrl+A Ctrl+I.

15

Obrázek 15: Disassembler.

16

Obrázek 16: Obsah pracovních registrů mikroprocesoru.

17

Obrázek 17: Další pracovní registry, zde konkrétně registry používané v SSE.

8. Textový editor Vim ve funkci integrovaného vývojového prostředí

Dlouholetým souputníkem a současně i rivalem textového editoru Emacs je programátorský editor nazvaný Vi, na nějž ideově navazuje v mnoha ohledech vylepšený textový editor Vim (zde se již nejedná „pouze“ o programátorský editor, ale o víceúčelovou aplikaci). Podobně jako tomu bylo v případě Emacsu a jeho skriptovacímu jazyka Elisp, i textový editor Vim se díky existenci jeho skriptovacího jazyka nazvaného Vim Script, podpoře maker, záložek (tabů), oken a bufferů může po instalaci vhodných pluginů (zmíněných dále) změnit v poměrně robustní a přitom výkonné integrované vývojové prostředí. Pro Vim vzniklo relativně velké množství pluginů zajišťujících propojení tohoto textového editoru s debuggerem (většinou se zmíněným GNU Debuggerem). Pravděpodobně nejznámějším z těchto pluginů je zásuvný modul nazvaný Clewn.

18

Obrázek 18: Úvodní obrazovka textového editoru Vim v případě, že již při inicializaci nedošlo k načtení souboru.

9. Funkce Vimu, které jsou používané pluginy spolupracujícími s debuggery

Editor Vim usnadňuje práci všem tvůrcům pluginů, které mají nějakým způsobem komunikovat s debuggery, protože jim nabízí tzv. Vim NetBeans Protocol. Název této technologie vychází z toho, že se kdysi jednalo o rozhraní používané výhradně pluginem nazvaným NetBeans pro komunikaci textového editoru Vim se známým integrovaným vývojovým prostředím NetBeans. Tento plugin již v současnosti není vyvíjen, ovšem samotný Vim NetBeans Protocol je podporován a taktéž používán mnoha dalšími pluginy, a to nikoli pro komunikaci s IDE NetBeans, ale právě při ovládání debuggerů.

19

Obrázek 19: Samotný Vim umožňuje ladění skriptů psaných ve Vim Scriptu, a to bez použití externího debuggeru.

Co vlastně Vim NetBeans Protocol tvůrcům pluginů nabízí? Především se jedná o podporu oboustranné komunikace, kdy debugger může Vimu poslat zprávu o tom, že se má překreslit obsah nějakého okna (například okna s výpisem sledovaných proměnných či okna disassembleru), Vim naopak může poslat příkaz debuggeru atd. Bližší informace o této zajímavé a užitečné technologii lze nalézt přímo ve Vimu zadáním příkazu:

:help netbeans

20

Obrázek 20: Bez podpory této technologie (viz červený obdélník) nebudou mnohé pluginy pracovat korektně! To se týká i pluginu Clewn popisovaného v dnešním článku.

10. Plugin Clewn zajišťující spolupráci s debuggery

Plugin nazvaný Clewn je přídavným modulem sloužícím pro propojení textového editoru Vim s debuggerem, konkrétně s GNU Debuggerem. Tento plugin umožňuje volat většinu základních příkazů GNU Debuggeru, ovšem způsob kooperace mezi Vimem a debuggerem, který je v pluginu Clewn implementován, nemusí všem uživatelům vyhovovat – v tomto případě je dobré se podívat na možnosti alternativního pluginu Pyclewn. Jakým způsobem vlastně přídavný modul Clewn funguje? Tento plugin obsahuje kromě části psané ve VimScriptu i binární (nativní) část, konkrétně spustitelný program nazvaný clewn, který je nainstalován v adresáři dostupném přes PATH (v případě lokální instalace se většinou jedná o adresář ~/bin). Tento binární program po svém spuštění provede inicializaci debuggeru a následně spuštění Gvimu, tj. Vimu s GUI. Tyto dvě aplikace pak spolu mohou přes nativní program clewn oboustranně komunikovat.

21

Obrázek 21: Připojení Vimu k debuggeru a nastavení breakpointu na začátek funkce main.

11. Použití pluginu Clewn v praxi

Ukažme si nyní jen velmi stručně způsob použití pluginu Clewn při ladění aplikace nazvané test.c. V prvním kroku je nutné přeložit zdrojový kód a přitom překladači přikázat, že se mají do výsledného spustitelného souboru přidat i nezbytné ladicí informace. V případě programovacího jazyka C a překladače gcc je to velmi jednoduché:

gcc -O0 -g -o test test.c

Výsledkem dokončení překladu bude v tomto případě binární spustitelný soubor nazvaný test. Následuje spuštění výše zmíněné utility clewn:

clewn -d -ga test

Tento příkaz by měl spustit a inicializovat debugger GNU Debugger a současně v novém okně spustit Gvim. Ovládání debuggeru lze provádět přímo z Vimu, v němž se otevře příslušný zdrojový kód (test.c). K dispozici jsou následující klávesové zkratky:

Klávesová zkratka Význam
R spuštění programu
Q ukončení ladění
Ctrl+B nastavení breakpointu na řádku s kurzorem
Ctrl+E vymazání breakpointů na řádku s kurzorem
B zobrazení informací o breakpointech
S jeden krok s vykonáním celé volané funkce (step)
I jeden krok s případným vstupem do volané funkce (step into)
C pokračovat ve vykonávání programu (continue)
L zobrazení informací o lokálních proměnných
A zobrazení informací o argumentech
W zobrazení informací, v jakém bodě se program nachází (backtrace)

Ve skutečnosti existuje ještě více klávesových zkratek, naleznete je v nápovědě k pluginu.

12. Plugin Pyclewn

Druhým pluginem určeným pro propojení textového editoru Vim s debuggerem je přídavný modul nazvaný Pyclewn. Tento plugin umožňuje práci s debuggerem GNU Debugger (použijí ho céčkači, vývojáři pracující v C++, Fortranu atd. atd.) a taktéž s debuggerem pdb používaném při ladění aplikací naprogramovaných v Pythonu. Tento plugin nepotřebuje pro svoji práci Gvim spuštěný s grafickým uživatelským rozhraním, protože veškerá činnost se odehrává v jediném terminálu a navíc se tento plugin spouští přímo z Vimu (u výše popsaného nástroje to bylo naopak – nejprve se spustil clewn, který následně otevřel nové okno s Gvimem).

22

Obrázek 22: Integrovaná nápověda k pluginu Pyclewn.

Samotné uživatelské prostředí připravené tímto pluginem (viz přiložené screenshoty) je snadno pochopitelné – jedno okno se používá pro zobrazení konzole debuggeru, další menší okna slouží pro výpis nastavených breakpointů, sledovaných proměnných atd. a poslední část plochy Vimu ukazuje laděný zdrojový kód, v němž jsou s využitím značek zvýrazněny breakpointy, zakázané breakpointy a ve chvíli krokování i právě prováděný prováděný řádek. Plugin mapuje i klávesové zkratky, další zkratky je samozřejmě možné v případě potřeby přidat.

23

Obrázek 23: Ladění programu napsaného v céčku: nastavení breakpointů, sledování proměnných atd. Povšimněte si, že tento plugin bez problémů pracuje i v terminálu, ovšem je zapotřebí použít větší okno (zde 80×25 znaků je nedostatečných, což je ovšem pochopitelné)

13. Předchozí části tohoto seriálu

  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. Debuggery a jejich nadstavby v Linuxu (4): KDbg
    http://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-4-kdbg/

14. Odkazy na Internetu

  1. An Introduction To Using GDB Under Emacs
    http://tedlab.mit.edu/~dr/gdbintro.html
  2. GNU Emacs
    https://www.gnu.org/software/emacs/emacs.html
  3. The Emacs Editor
    https://www.gnu.org/software/emacs/manual/html_node/emacs/index.html
  4. Emacs Lisp
    https://www.gnu.org/software/emacs/manual/html_node/elisp/index.html
  5. An Introduction to Programming in Emacs Lisp
    https://www.gnu.org/software/emacs/manual/html_node/eintr/index.html
  6. 27.6 Running Debuggers Under Emacs
    https://www.gnu.org/software/emacs/manual/html_node/emacs/Debuggers.html
  7. GdbMode
    http://www.emacswiki.org/emacs/GdbMode
  8. Emacs (Wikipedia)
    https://en.wikipedia.org/wiki/Emacs
  9. Emacs Lisp (Wikipedia)
    https://en.wikipedia.org/wiki/Emacs_Lisp
  10. Pyclewn installation notes
    http://pyclewn.sourceforge.net/install.html
  11. pip Installation
    https://pip.pypa.io/en/latest/installing.html
  12. Clewn
    http://clewn.sourceforge.net/
  13. Clewn installation
    http://clewn.sourceforge.net/install.html
  14. Clewn – soubory
    http://sourceforge.net/projects/clewn/files/OldFiles/
  15. KDbg: úvodní stránka
    http://www.kdbg.org/
  16. Nemiver (stránky projektu)
    https://wiki.gnome.org/Apps/Nemiver
  17. Nemiver FAQ
    https://wiki.gnome.org/Apps/Nemiver/FAQ
  18. Nemiver (Wikipedia)
    https://en.wikipedia.org/wiki/Nemiver
  19. Data Display Debugger
    https://www.gnu.org/software/ddd/
  20. GDB – Dokumentace
    http://sourceware.org/gdb/current/onlinedocs/gdb/
  21. BASH Debugger
    http://bashdb.sourceforge.net/
  22. The Perl Debugger(s)
    http://debugger.perl.org/
  23. Visual Debugging with DDD
    http://www.drdobbs.com/tools/visual-debugging-with-ddd/184404519
  24. Pydb – Extended Python Debugger
    http://bashdb.sourceforge.net/pydb/
  25. Insigh
    thttp://www.sourceware.org/insight/
  26. Supported Languages (GNU Debugger)
    http://sourceware.org/gdb/current/onlinedocs/gdb/Supported-Languages.html#Supported-Languages
  27. GNU Debugger (Wikipedia)
    https://en.wikipedia.org/wiki/GNU_Debugger
  28. The LLDB Debugger
    http://lldb.llvm.org/
  29. Debugger (Wikipedia)
    https://en.wikipedia.org/wiki/Debugger
  30. 13 Linux Debuggers for C++ Reviewed
    http://www.drdobbs.com/testing/13-linux-debuggers-for-c-reviewed/240156817
  31. Clewn
    http://clewn.sourceforge.net/
  32. Clewn installation
    http://clewn.sourceforge.net/install.html
  33. Clewn – soubory ke stažení
    http://sourceforge.net/projects/clewn/files/OldFiles/
  34. Pyclewn installation notes
    http://pyclewn.sourceforge.net/install.html
  35. Debugging
    http://janus.uclan.ac.uk/pagray/labs/debug.htm