Otóż z pomocą przychodzi GNU Debugger. Opiszmy krótko jego możliwości na przykładzie naszego problemu.
W celu odpluskwienia programów musimy je najpierw skompilować w gcc z opcją -g, a dopiero później uruchomić gdb na danym programie.
login@Kubuntu:~$ gcc -g -o test1 test1.c kwadrat.o login@Kubuntu:~$ gdb test1 GNU gdb 6.4-debian Copyright 2005 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".Najważniejsze polecenia w GDB:
break [file:]function | ustaw znak przerwania na funkcji |
run [arglist] | rozpocznij program (ten w argumencie wywołania gdb) z podanymi parametrami |
bt | wyświetl stos programu (przydatne w śledzeniu zagnieżdżonych wywołań funkcji) |
print expr | wyświetl wartość wyrażenia (najczęściej po prostu zmiennej) Uwaga: print x=5 jest przypisaniem |
c | wznów działanie programu po zatrzymaniu, np. w przypadku znaku przerwania |
next | wykonaj całą linijkę kodu w jednym kroku (w razie wywołania funkcji wykonuje ją na raz) |
list | wyświetl kod funkcji w danym kontekście, w którym się znajdujemy (np. list main) |
step | wykonaj krok w kodzie (najczęściej używana komenda) |
help [name] | wyświetl opis danej komendy |
quit | zakończ działanie GDB |
Uwaga: W przypadku używania gdb do odpluskwiania programu, warto pisać instrukcje nieco bardziej ,,obszernie'' niż byśmy to robili normalnie. To bardzo ułatwia późniejsze śledzenie programu po faktycznie ,,małych'' krokach. Przykładowo napisanie printf("%d\n",kwadrat(i)) uniemożliwiłoby łatwe dostanie się do wartości zwracanej przez funkcję kwadrat(). Dlatego też rozpisałem tę instrukcję na dwie.