Ladění ve Free Pascalu podruhé - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Ladění ve Free Pascalu podruhé

1. srpna 2001, 00.00 | V posledním dílu jste měli možnost seznámit se s debuggerem GDB. Dnes se naučíme takřka všechny jeho základní příkazy, takže s ním budete umět bez problémů pracovat.

V minulém dílu jsme začali pracovat s debuggerem GDB a ovládli jsme dva nejzákladnější příkazy - help a quit. Dnes půjdeme o něco dál.

Práce se soubory

Debuggeru musíme před začátkem práce sdělit, jaký soubor chceme vlastně ladit. S jedním způsobem, jak to udělat, jsme se už seznámili - stačí název souboru předat jako parametr při spouštění debuggeru. Další možností je použít příkaz file a jako parametr opět uvést jméno požadovaného souboru. Poslední variantou je připojit se k už běžícímu procesu pomocí příkazu attach.

Debugger samozřejmě potřebuje pro svou práci vědět, kde jsou zdrojové soubory programu. GDB si interně udržuje seznam adresářů, kde má "zdrojáky" hledat. Příkazem directory můžeme do tohoto seznamu libovolný adresář přidat. Obdobný seznam existuje pro už zkompilované programy a knihovny; přidání do něj zajišťuje příkaz path. Za dobu, co GDB používám, jsem zatím ani jeden z těchto příkazů nepotřeboval použít, ale to bylo velmi pravděpodobně tím, že jsem ve FPC nikdy nedělal projekty přesahující rámec jednoho adresáře. (Mimochodem - když už jme u těch adresářů - v debuggeru normálně funguje linuxový příkaz pwd (Print Working Directoy) na vypsání aktuálního adresáře a cd (Change Directory) na jeho změnu.)

Spuštění programu

Když máme program načtený, můžeme ho spustit příkazem run. Parametry, které mu předáme, budou v nezměněné podobě předány spuštěnému programu (stejně, jako by byl spuštěn z příkazového řádku). Běžící program ukončíme příkazem kill (jak poetické).

Ladění v plném proudu...

Breakpointy a krokování

Jedním z nejčastějších úkonů při ladění je vytváření breakpointů, čili míst, kde chceme běh programu přerušit. Na to máme v GDB příkaz break. Jeho parametrem je jedna za tří možností:

  • číslo řádku, kde chceme breakpoint nastavit
  • název funkce/procedury - v tom případě je breakpoint nastaven na její počátek
  • znak "*" následovaný adresou - breakpoint se nastaví přesně na dané místo v paměti

Breakpointy jsou po nastavení automaticky číslovány od jedničky dál, díky čemuž se na ně pak pohodlně můžeme odkazovat v příkazech. Všechny příkazy v několika následujících odstavcích mají tedy za parametr číslo breakpointu (popř. více čísel oddělených mezerou), se kterým (resp. kterými) chceme manipulovat.

Breakpointy můžeme rušit příkazem delete (pokud nezadáme číslo breakpointu, zruší se všechny). Můžeme je také dočasně vypnout a zase zapnout pomocí enable a disable. Lze také nastavit tzv. ignore-count, tedy číslo, kolikrát musí program skrz breakpoint proběhnout, než ten na to zareaguje (hodí se, když třeba víme, že chyba nastává přesně ve 155. iteraci for-cyklu). Příslušný příkaz se jmenuje (velmi nápaditě) ignore. Obdobně pomocí příkazu condition můžeme nastavit podmínku, při jejímž splnění se breakpoint při průchodu aktivuje (příklad využití: když víme, že chyba nastává jen když má některá proměnná určitou hodnotu).

Po průchodu breakpointem můžeme program znovu rozeběhnout příkazem continue nebo ho nechat běžet až do řádku specifikovaného parametrem příkazu until. Program lze také krokovat příkazem step nebo next, které způsobí postup o řádek dál. Rozdíl mezi těmito dvěma příkazy je v tom, že next se při krokování neponoří do volaných procedur či funkcí (celé jejich volání je chápáno jako jedna instrukce).

U příkazů step a next se nejvíc hodí vlastnost příkazového řádku, popisovaná v předchozím dílu seriálu - pokud totiž na řádek nic nenapíšeme a stiskneme Enter, debugger to bere tak, že má vykonat předchozí příkaz. Stačí tedy napsat jenom jednou next a pak už jen "odentrovávat" - a program je krokován sám.

Watches čili kukátka

V každém debuggeru můžeme samozřejmě prohlížet obsah proměnných či výrazů. Ta zajišťuje příkaz print, jehož parametrem je právě název libovolné proměnné (musí být samozřejmě v daném kontextu dostupná). S trochou snahy ho můžeme přinutit vytisknout i obsah libovolného místa v paměti. Pomocí příkazu set můžeme hodnoty proměnných i nastavovat.

Užitečným příkazem je display, který způsobí vypsání hodnoty proměnné předané jako parametr při každém zastavení programu. Pokud proměnnou už nadále vypisovat nechceme, stačí použít přikaz undisplay.

Pomocí příkazu watch můžeme nastavit, že se program zastaví při čtení nebo zápisu z/do proměnné, kterou uvedeme jako parametr. Příkaz má i svou variantu rwatch, která program zastaví jen při čtení (nikoliv při zápisu).

Výpis kódu

Při ladění je často potřeba vidět kód, ve kterém se nacházíme. To zajistí příkaz list. Ten vypíše 10 řádků následujících po aktuální pozici, popř. po předcházejícím výpisu. Místo, odkud se má začít vypisovat, je nastavitelné podobným způsobem, jako u příkazu break.

Závěr

Probrali jsme většinu těch nejdůležitějších příkazů GDB. Samozřejmě je jich mnohem víc (vynechali jsme například celou část o vláknech (threadech)) a některé příkazy mají také různé parametry a modifikace. Nejlepším pomocníkem je v tomto případě příkaz help a znalost angličtiny.

Dnes to tedy byla tak trochu "nalejvárna" (jak by řekl můj profesor fyziky na gymnáziu) a slibuji, že příště to bude o něco zajímavější. Podíváme se na některá úskalí spojení GDB s Free Pascalem a také zjistíte, proč to mají s laděním linuxáři jednodušší.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: