Poboljšajte kvalitetu koda i spriječite neočekivane rezultate tako što ćete naučiti kako koristiti GNU Debugger za otkrivanje neželjenih grešaka u vašem kodu.

Otklanjanje pogrešaka nezamjenjiva je vještina za programere i istraživače sigurnosti. Dobro razumijevanje otklanjanja pogrešaka omogućuje vam da razumijete izvršnu datoteku na nižoj razini i uhvatite sve skrivene pogreške.

GNU debugger ili GDB bezvremenski je alat za ispravljanje pogrešaka na koji se programeri oslanjaju već godinama. Evo kako koristiti GDB na Linuxu.

Priprema oglednih programa

Za istraživanje značajki GDB-a trebat će vam izvršna datoteka s kojom ćete eksperimentirati. Za demonstraciju, pokrenut ćete GDB na programu za provjeru ključeva jednom s dostupnim izvornim kodom i simbolima za otklanjanje pogrešaka, jednom bez izvornom kodu i na jednostavnom višenitnom programu koji ispisuje poruke na ekran, obje napisane u C-u i kompilirane s GCC-om (GNU C Sastavljač).

Možeš koristiti bilo koji drugi C prevodilac ali pazite da ne uklonite binarnu datoteku.

instagram viewer

Najvjerojatnije ćete pokretati GDB na vlastitim programima. Stoga ih svakako kompajlirajte s -g zastavica s gcc za omogućavanje simbola za otklanjanje pogrešaka.

Bez prisutnih simbola za otklanjanje pogrešaka i s jako ogoljenom binarnom datotekom, morat ćete otklanjati pogreške prilikom rastavljanja programa. To će od vas zahtijevati dobro poznavanje asemblerskog jezika i kako dodjela memorije radi na Linuxu razumjeti podatke u stogu i registrima.

Pokretanje programa u GDB-u

Program u GDB-u pokrećete na nekoliko načina. Ili upišite gdb , a kada se učita, upišite trčanje. Ili pokrenite gdb i zatim koristite datoteka naredbu, učitajte binarnu datoteku u gdb, a zatim je izvršite s trčanje naredba.

Ako vaš program zahtijeva argumente naredbenog retka za ispravno funkcioniranje, svakako dodajte argumente nakon naziva programa. Evo sintakse za učitavanje programa u GDB i njegovo izvršavanje s argumentima:

gdb 
run

Ili:

gdb
file
run

Postavljanje prijelomnih točaka s GDB-om

Prijelomne točke u otklanjanju pogrešaka su ručno postavljena čvrsta zaustavljanja u kodu koja zaustavljaju tok izvršenja kada program dosegne prijelomnu točku. Postavljanje prijelomnih točaka omogućuje vam prolazak kroz kod i provjeru kako svaka faza izvođenja utječe na podatke i varijable.

U GDB-u, kada ispravljate program s debug simbolima, možete postaviti prekidnu točku prema nazivu funkcije ili postaviti prekidnu točku na temelju broja retka. Evo sintakse:

break main
break 47

Za prikaz svih prijelomnih točaka u trenutnoj sesiji otklanjanja pogrešaka upišite:

info breakpoints

Za brisanje određene prijelomne točke ili više prijelomnih točaka upišite:

delete 2
delete 3-5

GDB vam također omogućuje postavljanje uvjetnih prijelomnih točaka, što znači da će se program zaustaviti samo ako je određeni uvjet zadovoljen tijekom izvođenja. To može biti promjena vrijednosti varijable ili neuspješan poziv funkcije ili bilo što što želite. Evo sintakse za postavljanje uvjetnih prijelomnih točaka:

break  if n == 2

Ako želite nastaviti s izvođenjem programa nakon što dođete do točke prekida, upišite nastaviti naredba:

continue

Prolazak kroz kod

Prolaženje koda ključno je za razumijevanje načina na koji program rukuje podacima. Prolaskom kroz različite funkcije u vašem programu i ispitivanjem stanja podataka, možete bolje razumjeti kako program implementira logiku koju ste napisali u kodu.

Također vam pomaže otkriti korijen padova i proučavati ponašanje programa s kirurškom preciznošću jer možete koračati kroz svaki red koda kako želite. U GDB-u možete prolaziti kroz kod na tri primarna načina:

  1. korak: Ova naredba govori GDB-u da prijeđe u sljedeći redak izvorne datoteke. To vam omogućuje da prijeđete duljinu izvornog koda redak po redak.
  2. Sljedeći: Ova naredba izvršava sljedeći redak izvornog koda unutar trenutne funkcije i zatim se zaustavlja. Sljedeći tretira funkciju kao jedan redak, tako da ako koristite next prije poziva funkcije, ona će je tretirati kao jednu liniju i preći preko nje, za razliku od korak naredba.
  3. Završi: Naredba završi izvršava sve preostale retke unutar trenutne funkcije i zatim se zaustavlja.

Ispitivanje varijabli

Dok koračate kroz kod, željeli biste ispitati vrijednost varijabli da vidite kako ih programska logika mijenja. Evo sintakse za pregled vrijednosti varijabli u GDB-u:

print 

U slučaju da želite ispisati promjene vrijednosti varijable svaki put kada se ažurira, trebate koristiti naredbu display. Ovo je posebno korisno kada želite pratiti i ispisati vrijednost varijable u petlji:

display 

Postavljanje promatračkih točaka

Točke promatranja i uvjetne prijelomne točke blisko su povezane jer obje reagiraju na promjene u programu. Točke promatranja koriste se za praćenje promjena podataka u kodu. Na primjer, možda želite da se program prekine kad god se promijeni vrijednost varijable. Evo kako to učiniti s GDB-om:

watch 

Otklanjanje pogrešaka specifičnih za niti s GDB-om

GDB vam omogućuje izvođenje debug-a specifičnog za nit kada radite s programima s više niti. Radi demonstracije, radit ćemo s jednostavnim C programom koji koristi četiri niti za ispis poruka sa svakom niti.

Za prikaz trenutno stvorenih niti u vašem programu, koristite info naredba:

info threads

Da biste radili s određenom niti, možete je odabrati s popisa koristeći njen indeksni broj. Na primjer:

thread 2

Nakon odabira niti možete koračati kroz njen tijek izvođenja pomoću korak, Sljedeći, i Završi naredbe kao što je prikazano gore.

Udaljeno otklanjanje pogrešaka s GDB-om

Također možete daljinski debugirati programe koji se nalaze na drugom sustavu. Da biste to učinili, trebate postaviti gdbserver na ciljnom računalu. Možete ga jednostavno instalirati pomoću zadanog upravitelja paketa vaše distribucije ili druge upravitelje paketa koje ste instalirali na vašem sustavu.

Na primjer, da biste instalirali gdbserver na svoje Ubuntu ili Debian sustave, koristite APT:

sudo apt install gdbserver

Nakon instalacije, prijeđite u mapu binarne datoteke i pokrenite ovu naredbu za pokretanje gdbservera:

gdbserver :

gdbserver bi trebao vratiti izlaz da radi i da sluša na portu koji ste definirali. Sada na klijentskom stroju pokrenite GDB i zatim se spojite na udaljeni poslužitelj pomoću cilj naredba:

target remote :

Pisanje GDB skripti za automatiziranje otklanjanja pogrešaka

GDB programerima omogućuje pisanje GDB skripti koje će automatski izvršavati GDB naredbe. To iznimno pomaže kada pokušavate otkloniti pogreške u istom dijelu koda više puta. Umjesto da morate postavljati prijelomnu točku, prolaziti kroz kod i ispisivati ​​vrijednosti varijabli svaki put kada učitate binarnu datoteku, možete koristiti GDB skriptu za automatizaciju cijelog procesa.

Evo primjera:

set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit

U gornjoj skripti govorite GDB-u da omogući zapisivanje i spremi zapis u datoteku pod nazivom uzorak.out, zatim postavite točku prekida na glavni funkcija.

Za prijelomnu točku broj 1, u ovom slučaju, prijelomnu točku na glavnoj funkciji, pokrenite sljedeće naredbe: povratni trag, ispisati, nastaviti. U osnovi, GDB će prvo pokrenuti povratno praćenje, zatim ispisati vrijednost varijable "N", nastaviti s izvođenjem i na kraju zatvoriti.

Da biste izvršili ovu skriptu, koristite:

gdb -x