Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

GDB dla początkujących

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

Źródło: Wikipedia

r   e   k   l   a   m   a
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. 

bezpieczeństwo porady programowanie

Komentarze