Ladeni programu pod XWindow

Hynek Bakstein

Kazdy programator dela chyby - to je zakladni pravidlo programovani. Chyby lze delit na syntakticke - na ty vas ( veltsinou ) upozorni prekladac pri prekladu ( nekdy az linker.. ) a semanticke. Semanticke chyby jsou horsi, protoze se hledaji tezko. Projevuji se tim, ze program bud nebezi vubec, nebo dava chybne vysledky. S prichodem ukazatelu se pridal jeste dalsi priznak - nekdy bezi, nekdy ne. Na odstranovani techto chyb existuje nekolik metod. Mezi nejpouzivanejsi patri ladici hlasky - program vypisuje na kozoli co prave dela ( vhodne pouze pro male casti kodu ) a ladeni v debuggeru.

Na Linuxu je k dispozici GNU debugger ( GDB ). Je to neocenitelny pomocnik, ale pro zacatecnika je jeho ovladani tezsi - ovlada se totiz z vlastni prikazove radky. Hlavnich prikazu je malo a jsou snadno zapamatovatelne, ale pri sledovani slozitych struktur a vice promennych se projevi hlavni nevyhoda tohoto ovladani - mala prehlednost. Bud nam po obrazovce odroluje ohromne mnozstvi vypisu, nebo musime neustale zadavat prikazy pro zobrazeni urcite promenne. Pokud mame v oblibe prostredi XWindow, nebo pro nej primo piseme programy, muzeme si vybrat z nekolika grafickych nadstaveb ke gdb.

Nejjednodussi je xxdgb. Jedna se vlastne o presmerovani vystupu gdb do jednoho okna a vtupu do jineho a par tlacitek pro nejcastejsi prikazy. Pro lidi zvykle na Borlandi prostredi ( IDE ) je tu xwpe. Je to imitace borlandiho IDE vcetne editoru i ovladani debuggeru. Nejlepsi a nejpropracovanejsi je ale DDD - Data Display Debugger. Zbytek referatu bude o nem.

DDD je nejen front-end ke gdb, ale poskytuje programatorovi graficky pohled na data. Pokud chcete videt obsah nejake promenne - zobrazi se vam jako "krabicka" ve zvlastnim okne - Data window. Pokud je to ukazatel, muzete jej samozrejme dereferencovat a ted se projevi hlavni prednost programu DDD - v tom pripade se totiz objevi dalsi "krabicka", spojena s ukazatelem na sebe sipkou. Pokud se jedna o strukturu, muzete si nechat ukazat jen vybrane polozky, pokud obsahuje dlasi strukturu, muzete si zobrazit i ji. Ukazatele muzete dereferencovat libovolne a prvky reprezentujici obsah promennych muzete posouvat, takze si je muzete prehledne usporadat. Tak napriklad strom si usporadate jako strom a pri vkladani prvku vidite kam presne se vlozil. Tak muzete lehce a intuitivne videt chovani programu v akci. Z vlastni zkusenosti mohu rici, ze to velmi usnadnuje hledani chyb v dynamickych strukturach. A nyni podrobeji k vlastnimu pouzivani DDD.

DDD pouziva motif nebo od verze 2.1.1 Lesstif a muzete si jej stahnou ve zdrojovem tvaru, nebo skompilovany staticky (vsechno staticky i X), semistaticky (staticky s Motifem, dynamicky ostatni) nebo dynamicky. Program spustite prikazem ddd. Jako parametr muzete zadat nazev ladeneho programu, core, ale i bezici proces. Objevi se vam hlavni okno obsahujici prikazovou radku gdb a menu pro zakladni funkce (otevreni souboru, zobrazeni dalsich oken, nejpouzivanejsi prikazy... ).

Command okno.

obr.1 - Hlavni okno.

Pokud jste nezadali zadny soubor jako parametr, musite jej otevrit pomoci menu File->Open. Pak se objevi okno se zdrojovym textem souboru (byl-li skompilovan s parametrem -g samorzejme...)

Source text window.

obr.2 - Okno se zdrojovym textem. Sipka oznacuje prave provadeny radek kodu a ikona STOP oznacuje breakpoint

a (od verze 2.0) okno s tlacitky pro rychly pristup k prikazum gdb.

Toolbar.

obr.3 -Toolbar pro rychle zadavani nejcastejsich prikazu.

Pak uz zbyva jen urcit ve zdrojovem souboru breakpointy tuknutim mysi na zvoleny radek a na tlacitko Breakpoint - viz obr.2, nebo po stisku praveho tlacitka ve vyvolanem pop-up menu vybranim polozky Breakpoint a muzeme program spustit prikazem Program->Run nebo pres tlacitko Run na toolbaru. Po spusteni programu se objevi Execution window ve kterem se zobrazuji vystupy program a kde se zadavaji vstupy , ktere program cte ze stdin. Po preruseni programu po dosazeni breakpointu, nebo stisku tlacitka Int, nam zelena sipka oznacuje aktualni radek kodu. Pokud chceme videt obsah nejake promenne presuneme na ni tuknutim leveho tlacitka mysi kurzor a tukneme na tlacitko Display nebo opet vyberem polozku Display z pop-up menu po stisku praveho tlacitka. Pokud chceme zobrazit obsah prvku struktury, napr. seznam->prvek, oznacime si mysi jmeno struktuy i s timto prvkem a pak jej zobrazime stejnym spusobem jako u jednoduche promenne. Pokud je to prvni promenna, kterou jsme si nechali zobrazit, objevi se nam okno Data Window, jinak se do nej prida nova "krabicka" reprezentujici obsah promenne.

Data Window

obr. 4 - Data window.

Od verze 2.1 staci prejet pres jmeno promenne mysi a jeji obsah se nam objevi na stavovem radku okna se zdrojovym textem a podrzime-li kurzor nad promennou, tak se objevi male okno s jejim obsahem jako bublinova napoveda.

Pokud zobrazena promenna je pointer nebo struktura obsahujici pointer, muzeme jej dereferencovat tim, ze jej oznacime tlacitkem mysi a stiskneme tlacitko Display *(). Pokud zobrazena promenna je struktura a obsahuje dalsi vnorenou strukturu, muzeme si ji zobrazit pomoci tlacitka Show (). Samozrejme pokud nas uz nezajima, schovame ji pomoci tlacitka Hide () (Nahradi Show() ).Tlacitko Disable() slouzi k vypnuti sledovani obsahu promenne (i casti struktury) - usetri to hodne casu pri krokovani - promennou si pak muzeme prohlednout az kdyz nas to zajima pomoci tlacitka Enable (). Vyznam Delete () je jasny. Tlacitko New Display nam vytvori novou "krabicku" s obsahem promenne. Tlacitko Set() umozni nastavit obsah promenne. V input line za textem (): vidime nazev vybrane promenne a muzeme sem samozrejme nazev napsat rucne. Tlacitko Rotate () meni zobrazeni poli z horizontalniho na vertikalni a obracene. Pokud je nejaka struktura sdilena (ukazuje na ni vice ukazatelu), pak lze zamezit jejimu duplikatnimu vyskytu v data okne pomoci menu Data->Detect Aliases, ddd pak nevytvari u jiz existujici "krabicky" duplikat, ale spoji misto toho odkazujici "krabicku" s jiz existujici. Pomoci Data->Local Variables lze zobrazit lokalni promenne a Data->Arguments predane argumenty z prikazove radky. U poli promenne delky si muzete zobrazit jenom cast pomoci prikazove radky debuggeru vymezenim mezi [od..do] za prikazem pro zobrazeni: graph display array[0..9] vytvori "krabicky" pro array[0], array[1], ... , array[9]. Prikaz graph display array[0] @ 10 zobrazi "krabicku" s hodnotami array[0] az array[9], tedy hodnota za @ znamena pocet zobrazenych prvku pole. Tyto volby jsou vazany na gdb. Jednotlive "krabicky" muzete zarovnavat na mrizce, a ruzne formatovat a posouvat a vysledny graf si muzete nechat vytisknout.

Smyslem tohoto referatu neni suplovat manual k ddd, proto se zde nebudu podrobne rozepisovat o vsech jeho moznostech. Jsou ostatne vazany k pouzitemu debuggeru - ve vetsine pripadu to bude gdb, ale je mozno pouzit i dbx a xdb. Takze jen ve zkratce: s pomoci ddd muzete ladit program - ddd program, bezici proces - spustite prikazem ddd program PID, nebo prozkoumat coredump - ddd --core=COREFILE. U breakpointu muzete zadavat podminky a pocet pruchodu, muzete je i docasne deaktivovat. V program window v menu Status si muzete nechat zobrazit backtrace, vlakna a jakekoli vlakno muzete vybrat jako aktivni, registry a mnoho dalsich... Pri spusteni programu mu lze zadat argumenty. Moznosti a voleb je spousta a jaho zdroj napovedy vam poslouzi vestavena napoveda, ktera je kontextova, bublinova, a nebo pristupna pres menu a manualova stranka. Zaverem snad jen ze ddd nenni jen pro programy napsane v jazyce C a C++, ale v i Module-2, Module-3, Pascalu, Ade. Fortranu.

Lynx now