Ladění programu pomocí gdb: Porovnání verzí
(Založení stránky) |
(Doplnění) |
||
Řádka 36: | Řádka 36: | ||
(gdb) | (gdb) | ||
− | + | Pokud by program gdb vypíše hlášení ''no debugging symbols found'', je potřeba zkontrolovat zadání parametru <code>-g</code> při překladu jako parametr (pro překladač <code>gcc</code>). V interním řádkovém rozhraní je možné zadávat příkazy, kterými je gdb řízen (viz dále). | |
+ | |||
+ | === Krokování programu === | ||
+ | ;list: Příkaz ''list'' vypíše zdrojový kód programu včetně čísel řádků. Parametrem může být číslo řádku, jméno funkce, dvojice ''soubor:jménofunkce'' nebo rozsah řádků oddělený čárkou. | ||
+ | ;break: Příkaz ''break'' slouží k vytvoření bodu přerušení v programu (též ''zarážka''). Parametrem může být číslo řádku nebo název funkce a oboje může být podobně jako u příkazu ''list'' upřesněno názvem souboru s dvojtečkou. Za parametr může být doplněno klíčové slovo ''if'', za kterým je možné předepsat podmínku pro přerušení (např. <code>x>5</code>). | ||
+ | ;watch: Příkaz ''watch'' definuje výraz, při jehož splnění je program pozastaven (např. <code>x>5</code>). | ||
+ | ;clear: Příkaz ''clear'' slouží ke zrušení bodu přerušení definovaného příkazem ''break''. | ||
+ | ;next: Příkaz ''next'' spustí program až do začátku následujícího příkazu ve zdrojovém kódu. Pokud je na aktuálním řádku volání funkce, je tato provedena celá. | ||
+ | ;step: Příkaz ''step'' udělá v programu jeden krok (tj. jeden příkaz). Pokud je na aktuálním řádku volání funkce, vstoupí se do ní a provádění se zastaví (bude možné funkci krokovat). | ||
+ | ;until: Příkaz ''unitl'' spustí program až do specifikovaného místa (číslo řádku, název funkce). | ||
+ | ;finish: Příkaz ''finish'' způsobí, že aktuální funkce je dokončena. | ||
+ | ;continue: Pokračování běhu programu (až do dalšího bodu přerušení). | ||
+ | ;run: Příkaz ''run'' slouží ke spuštění programu, který je do gdb natažen. Případné parametry uvedené za příkazem ''run'' jsou programu předány, jako by byl s nimi spuštěn z příkazového řádku. | ||
+ | |||
+ | === Inspekce proměnných a paměti === | ||
+ | ;print: Příkaz ''print'' slouží k vypsání obsahu proměnné, která je zadána jako parametr. Předřazením znaku & je vypsána adresa, na které je proměnná umístěna (spolu s datovým typem). | ||
+ | ;info locals: Příkaz ''info locals'' vypíše všechny lokální proměnné v aktuálním kontextu programu. | ||
+ | ;x: Příkaz ''x'' slouží k inspekci obsahu paměti. Parametrem může být adresa v paměti, název funkce nebo znak & následovaný jménem proměnné (vypíše adresu paměti a její obsah). | ||
+ | ;backtrace: Příkaz ''backtrace'' vypíše obsah zásobníku ve smyslu seznamu aktuálního stavu volání funkcí (tj. všechna volání funkcí, resp. návratů z funkcí). | ||
+ | |||
+ | === Ostatní === | ||
+ | ;quit: Příkaz ''quit'' slouží k ukončení činnosti gdb. | ||
+ | ;kill: Příkaz ''kill'' ukončí běh právě zpracovávaného programu. | ||
+ | ;help: Příkaz ''help'' vypíše nápovědu. Parametrem může být libovolný příkaz. | ||
+ | ;info: Příkaz ''info'' vypisuje různé informace o stavu debuggeru. Parametrem může být například ''args'' (argumenty programu z příkazového řádku), ''breakpoints'' (výpis bodů přerušení), ''watchpoints'' (dtto), ''registers'' (obsah registrů procesoru), ''threads'' (spuštěné thready), ''set'' (interní nstavení gdb). |
Verze z 5. 4. 2011, 12:09
Ladění programu pomocí gdb je vhodné pro práci v příkazovém řádku. Debugger gdb slouží pro krokování programu, inspekci proměnných, ale i analýzu core (soubory s obrazem paměti po pádu programu). Existují nadstavby jak pro textové rozhraní (např. cgdb), tak pro grafické rozhraní (např. ddd) nebo je možné ladit program přímo v integrovaném vývojovém prostředí (Eclipse). Text se bude dále zabývat použitím debuggeru přímo na příkazovém řádku.
Obsah
Přeložení programu
Program, který chceme ladit pomocí gdb, je nutné přeložit s přepínačem -g
. Mějme zdrojový kód programu v souboru vypocet.c
:
#include <stdio.h>
int main()
{
int a, x = 3;
a = x + 5;
printf("Vysledek: %d\n", a);
return 1;
}
Pak ho přeložíme takto:
gcc -g -o vypocet vypocet.c
Ladění programu
Program natáhneme do debuggeru příkazem gdb vypocet
, načež je zobrazena licence a aktivuje se interní řádkové rozhraní debuggeru (v následujícím příkladu je vstup uživatel vyznačen tučně):
$ gdb vypocet GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-23.el5_5.2) Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/kerslage/vyuka/pre/vypocet...done. (gdb)
Pokud by program gdb vypíše hlášení no debugging symbols found, je potřeba zkontrolovat zadání parametru -g
při překladu jako parametr (pro překladač gcc
). V interním řádkovém rozhraní je možné zadávat příkazy, kterými je gdb řízen (viz dále).
Krokování programu
- list
- Příkaz list vypíše zdrojový kód programu včetně čísel řádků. Parametrem může být číslo řádku, jméno funkce, dvojice soubor:jménofunkce nebo rozsah řádků oddělený čárkou.
- break
- Příkaz break slouží k vytvoření bodu přerušení v programu (též zarážka). Parametrem může být číslo řádku nebo název funkce a oboje může být podobně jako u příkazu list upřesněno názvem souboru s dvojtečkou. Za parametr může být doplněno klíčové slovo if, za kterým je možné předepsat podmínku pro přerušení (např.
x>5
). - watch
- Příkaz watch definuje výraz, při jehož splnění je program pozastaven (např.
x>5
). - clear
- Příkaz clear slouží ke zrušení bodu přerušení definovaného příkazem break.
- next
- Příkaz next spustí program až do začátku následujícího příkazu ve zdrojovém kódu. Pokud je na aktuálním řádku volání funkce, je tato provedena celá.
- step
- Příkaz step udělá v programu jeden krok (tj. jeden příkaz). Pokud je na aktuálním řádku volání funkce, vstoupí se do ní a provádění se zastaví (bude možné funkci krokovat).
- until
- Příkaz unitl spustí program až do specifikovaného místa (číslo řádku, název funkce).
- finish
- Příkaz finish způsobí, že aktuální funkce je dokončena.
- continue
- Pokračování běhu programu (až do dalšího bodu přerušení).
- run
- Příkaz run slouží ke spuštění programu, který je do gdb natažen. Případné parametry uvedené za příkazem run jsou programu předány, jako by byl s nimi spuštěn z příkazového řádku.
Inspekce proměnných a paměti
- Příkaz print slouží k vypsání obsahu proměnné, která je zadána jako parametr. Předřazením znaku & je vypsána adresa, na které je proměnná umístěna (spolu s datovým typem).
- info locals
- Příkaz info locals vypíše všechny lokální proměnné v aktuálním kontextu programu.
- x
- Příkaz x slouží k inspekci obsahu paměti. Parametrem může být adresa v paměti, název funkce nebo znak & následovaný jménem proměnné (vypíše adresu paměti a její obsah).
- backtrace
- Příkaz backtrace vypíše obsah zásobníku ve smyslu seznamu aktuálního stavu volání funkcí (tj. všechna volání funkcí, resp. návratů z funkcí).
Ostatní
- quit
- Příkaz quit slouží k ukončení činnosti gdb.
- kill
- Příkaz kill ukončí běh právě zpracovávaného programu.
- help
- Příkaz help vypíše nápovědu. Parametrem může být libovolný příkaz.
- info
- Příkaz info vypisuje různé informace o stavu debuggeru. Parametrem může být například args (argumenty programu z příkazového řádku), breakpoints (výpis bodů přerušení), watchpoints (dtto), registers (obsah registrů procesoru), threads (spuštěné thready), set (interní nstavení gdb).