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

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

0 nowych
TestamenT   12 #1 10.05.2012 13:49

@Draqun ja się nie pogniewam jeżeli zastąpisz dokumentacje :)
Bo ten króciutki wstęp do GDB mi się przyda. Zwłaszcza że GDB mogę używać przy programach napisanych w Go.

etam   10 #2 11.05.2012 10:53

Polecam gorąco cgdb (http://cgdb.sourceforge.net/).

Przy okazji przydatna wiedza: jak uruchomić program w gdb z argumentami wywołania:
$ gdb ./nazwa_binarki
(gdb) run agrumenty wywołania < strumień_z_pliku_też_działa

TestamenT   12 #3 11.05.2012 11:53

@etam bardzo przydatny program. Szkoda że ma kolorowanie składni tylko dla 3 języków. A dodanie nowych wymaga ingerencji w kod.

cybe   2 #4 11.05.2012 13:09

Od razu przypomniało mi się programowanie w asemblerze pod systemami z jądrem Linuksa :) Fajna sprawa.

Draqun   9 #5 11.05.2012 23:27

@TestamenT
GDB jest tak potężnym narzędziem, że nie ma szans abym zgłębił wszystkie jego możliwości. Poza tym aby w pełni umieć korzystać z GDB należy choć w podstawach znać asemblera a także wiedzieć co się dzieje w pamięci operacyjnej w trakcie działania programu. Może jak znajdę czas to opiszę coś więcej ale nic nie obiecuję,

@etam
Właśnie wiedziałem, że zapomniałem o czymś podstawowym.