GDB dla początkujących
09.05.2012 17:09
Ostatnio nie mam za wiele czasu jednak zbliża się termin oddawania programów pisanych z użyciem C/C++ i z doświadczenia wiem, że początkującym wszelka pomoc się przyda.
Narzędzie, który powinien znać każdy programista jest Debugger.
Co to jest debugger
A debugger or debugging tool is a computer program that is used to test and debug other programs (the "target" program).
Wspomniany w tytule GDB czyli GNU Debugger jest właśnie takim programem od odpluskwiania. Domyślnie jest on instalowany w sporej ilości dystrybucji Linuks a na pewno jest w repozytorium każdej z nich.
Przygotowanie programu
Aby korzystać z dobrodziejstw debuggera należy skompilować program z opcją -g a więc
g++ -g -o nazwabinarki plikźródłowy.cpp
Kiedy już mamy tak skompilowany program, należy uruchomić go za pomocą debugger
gdb nazwabinarki
I co dalej
Kiedy już uruchomiliśmy debugger z naszym programem pojawia się nam znak zachęty
(gdb)
Aby uruchomić nasz program wystarczy podać komendę "run". Komenda ta uruchamia nasz program, i informuje nas o sukcesie lub porażce wykonania programu. W razie porażki wskaże nam miejsce błędu. Oczywiście nie jest to do końca prawdą ponieważ jeśli błędem jest wyciek pamięci debugger może wskazać nam, że błąd jest w linii np. z nawiasem zamykającym blok.
Co może GDB
Jedną z najważniejszych rzeczy są breakpointy. Aby postawić breakpoint przed wywołaniem "run" podajemy komendę
breakpoint <plik>:<funkcja lub/i linia> lub break <plik>:<funkcja lub/i linia> lub tbreakpoint <plik>:<funkcja lub/i linia> - breakpoint, który zatrzyma się raz a następnie zostanie usunięty.
Aby sprawdzić listę posiadanych breakpointów podajemy
info breakpoint.
Jeśli chcemy usunąć dany breakpoint podajemy
delete breakpoint <numer breakpointa> - numerek znajdziemy po wyświetleniu info breakpoint.
Aby usunąć wszystkie breakpointy na raz wystarczy samo delete.
Breakpoint może zostać także aktywowany i deaktywowany
enable/disable [once[delete]]<numer> - włączenie/wyłącznie breakpointu [jednokrotne[i usuń]]
Poza klasycznymi breakpointami GDB posiada narzędzie zwane watchpoint. Watchpoint jest typem breakpointa, który zatrzymuje działanie programu jednak pokazuje informację o starej wartości zmiennej, nowej wartości zmiennej i linię kodu, w której ta zmiana nastąpiła np.
watchpoint <nazwa zmiennej> lub watch <nawa zmiennej>
Kiedy już breakpoint lub watchpoint zatrzyma nam program znów posiadamy znak zachęty debuggera. Aby wznowić pracę mamy trzy możliwości
step - przejście do następnej instrukcji i next - przejście do kolejnego breakpointa lub końca programu i continue <ilosc breakpointow> - kontynuacja programu z możliwością pominięcia wskazanej ilości breakpointów.
Istnieją jeszcze dwa przydatne polecenia dotyczące zmiennych.
print <nazwa zmiennej> - jednorazowe wyświetlenie zawartości zmiennej lub display - wyświetla zawartość zmiennej za każdym razem kiedy program się zatrzyma.
Analogicznie jak z breakpointami tak za pomocą
info display - wyświetlamy zmienne jakie mamy wyświetlać i delete display <numer zmiennej>- usunięcie "displaya" ze zmiennej
Dla początkujących będzie jeszcze przydatne wyjście z pętli, gdy sterujemy programem krok po kroku za pomocą step. Do tego wykorzystujemy polecenie
until.
Podsumowanie
To co pokazałem nie jest nawet podstawą mocy GDB a podstawą podstaw. Za pomocą tego narzędzia można zrobić na prawdę wiele "magicznych" rzeczy, które pomagają w znajdywaniu bugów w programach. Jednakże nie chcę zastępować wam dokumentacji a pomóc osobom, które dopiero zaczynają zabawę z programowaniem i nie mogą poradzić sobie z odnalezieniem błędu.
Pozdrawiam.