Izboljšajte kakovost kode in preprečite nepričakovane rezultate tako, da se naučite uporabljati GNU Debugger za odkrivanje neželenih napak v vaši kodi.

Odpravljanje napak je nepogrešljiva veščina za programerje in varnostne raziskovalce. Močno razumevanje odpravljanja napak vam omogoča, da razumete izvršljivo datoteko na nižji ravni in ujamete morebitne skrite napake.

Razhroščevalnik GNU ali GDB je brezčasno orodje za odpravljanje napak, na katerega se programerji zanašajo že leta. Tukaj je opisano, kako uporabljati GDB v Linuxu.

Priprava vzorčnih programov

Če želite raziskati funkcije GDB, boste potrebovali izvršljivo datoteko za eksperimentiranje. Za predstavitev boste enkrat zagnali GDB v programu za preverjanje ključev z izvorno kodo in simboli za odpravljanje napak, enkrat brez izvorno kodo in v preprostem večnitnem programu, ki na zaslon natisne sporočila, oba napisana v C in prevedena z GCC (GNU C Prevajalnik).

Ti lahko uporabite kateri koli drug prevajalnik C vendar pazite, da ne odstranite dvojiške datoteke.

instagram viewer

Najverjetneje boste izvajali GDB v svojih programih. Zato jih prevedite z -g zastavica z gcc za omogočanje simbolov za odpravljanje napak.

Brez prisotnih simbolov za odpravljanje napak in z močno odstranjeno dvojiško datoteko boste morali odpravljati napake pri razstavljanju programa. To bo zahtevalo, da dobro obvladate zbirni jezik in kako deluje dodeljevanje pomnilnika v Linuxu razumeti podatke v skladu in registrih.

Izvajanje programa v GDB

Program v GDB izvajate na več načinov. Bodisi vnesite gdb , in ko se naloži, vnesite teči. Ali pa zaženite gdb in nato uporabite mapa ukaz, naložite dvojiško datoteko v gdb in jo nato izvedite z teči ukaz.

Če vaš program za pravilno delovanje potrebuje argumente ukazne vrstice, ne pozabite dodati argumentov za imenom programa. Tukaj je sintaksa za nalaganje programa v GDB in njegovo izvajanje z argumenti:

gdb 
run

ali:

gdb
file
run

Nastavitev prelomnih točk z GDB

Prekinitvene točke pri odpravljanju napak so ročno nastavljene trde zaustavitve v kodi, ki ustavijo tok izvajanja, ko program doseže prekinitveno točko. Nastavitev prekinitvenih točk vam omogoča korakanje skozi kodo in pregledovanje, kako posamezna stopnja izvajanja vpliva na podatke in spremenljivke.

Ko v GDB odpravljate napake v programu s simboli za odpravljanje napak, lahko nastavite prekinitveno točko z imenom funkcije ali nastavite prekinitveno točko na podlagi številke vrstice. Tukaj je sintaksa:

break main
break 47

Če si želite ogledati vse prekinitvene točke v trenutni seji odpravljanja napak, vnesite:

info breakpoints

Če želite izbrisati določeno prekinitveno točko ali več prelomnih točk, vnesite:

delete 2
delete 3-5

GDB vam omogoča tudi nastavitev pogojnih prekinitvenih točk, kar pomeni, da se bo program ustavil samo, če je med izvajanjem izpolnjen določen pogoj. Lahko je sprememba vrednosti spremenljivke ali neuspešen klic funkcije ali karkoli želite. Tukaj je sintaksa za nastavitev pogojnih prelomnih točk:

break  if n == 2

Če želite nadaljevati z izvajanjem programa po dosegu prekinitvene točke, vnesite nadaljevati ukaz:

continue

Korakanje skozi kodo

Prehod skozi kodo je ključnega pomena za razumevanje, kako program obravnava podatke. S postopkom skozi različne funkcije v vašem programu in pregledovanjem stanja podatkov lahko bolje razumete, kako program izvaja logiko, ki ste jo zapisali v kodi.

Pomaga vam tudi pri odkrivanju korenin zrušitev in preučevanju vedenja programa s kirurško natančnostjo, saj lahko korakate skozi vsako vrstico kode, kot želite. V GDB se lahko skozi kodo premikate na tri glavne načine:

  1. korak: Ta ukaz GDB pove, naj stopi v naslednjo vrstico izvorne datoteke. To vam omogoča, da v bistvu prečkate dolžino izvorne kode vrstico za vrstico.
  2. Naslednji: Ta ukaz izvede naslednjo vrstico izvorne kode znotraj trenutne funkcije in se nato ustavi. Naslednji obravnava funkcijo kot eno vrstico, tako da, če uporabite next pred klicem funkcije, jo bo obravnavala kot eno vrstico in stopila čeznjo, za razliko od korak ukaz.
  3. zaključek: Ukaz dokončaj izvede vse preostale vrstice znotraj trenutne funkcije in se nato ustavi.

Pregledovanje spremenljivk

Ko korakate skozi kodo, bi želeli pregledati vrednost spremenljivk, da vidite, kako jih programska logika spreminja. Tukaj je sintaksa za ogled vrednosti spremenljivk v GDB:

print 

Če želite natisniti spremembe vrednosti spremenljivke ob vsaki posodobitvi, morate uporabiti ukaz display. To je še posebej uporabno, če želite slediti in natisniti vrednost spremenljivke v zanki:

display 

Nastavitev opazovalnih točk

Nadzorne točke in pogojne prekinitvene točke so tesno povezane, saj se obe odzivajo na spremembe v programu. Nadzorne točke se uporabljajo za sledenje spremembam podatkov v kodi. Na primer, morda želite, da se program prekine vsakič, ko se spremeni vrednost spremenljivke. Tukaj je opisano, kako to storite z GDB:

watch 

Odpravljanje napak, specifično za nit, z GDB

GDB vam omogoča izvajanje razhroščevanja, specifičnega za nit, pri delu z večnitnimi programi. Za predstavitev bomo delali s preprostim programom C, ki uporablja štiri niti za tiskanje sporočil z vsako nitjo.

Za ogled trenutno ustvarjenih niti v vašem programu uporabite info ukaz:

info threads

Če želite delati z določeno nitjo, jo lahko izberete s seznama z njeno indeksno številko. Na primer:

thread 2

Ko izberete nit, se lahko premikate skozi njen tok izvajanja z uporabo korak, Naslednji, in končati ukaze, kot je prikazano zgoraj.

Oddaljeno odpravljanje napak z GDB

Prav tako lahko na daljavo odpravite napake v programih, ki se nahajajo v drugem sistemu. Če želite to narediti, morate na ciljnem računalniku nastaviti gdbserver. Z lahkoto ga namestite s privzetim upraviteljem paketov vaše distribucije oz druge upravitelje paketov, ki ste jih namestili na vašem sistemu.

Če želite na primer namestiti gdbserver v svoje sisteme Ubuntu ali Debian, uporabite APT:

sudo apt install gdbserver

Ko je nameščen, se premaknite v mapo binarne datoteke in zaženite ta ukaz, da zaženete gdbserver:

gdbserver :

gdbserver bi moral vrniti izhod, da deluje in posluša na vratih, ki ste jih definirali. Zdaj na odjemalskem računalniku zaženite GDB in se nato povežite z oddaljenim strežnikom z uporabo tarča ukaz:

target remote :

Pisanje skriptov GDB za avtomatsko odpravljanje napak

GDB programerjem omogoča pisanje skriptov GDB, ki bodo samodejno izvajale ukaze GDB. To izjemno pomaga, ko poskušate večkrat odpraviti napake v istem delu kode. Namesto da bi morali vsakič, ko naložite dvojiško datoteko, nastaviti prekinitveno točko, korakati skozi kodo in tiskati vrednosti spremenljivk, lahko uporabite skript GDB za avtomatizacijo celotnega procesa.

Tukaj je primer:

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

V zgornjem skriptu sporočate GDB, naj omogoči beleženje in shrani dnevnik v datoteko, imenovano vzorec.ven, nato nastavite prekinitveno točko na glavni funkcijo.

Za prekinitveno točko številka 1, v tem primeru prekinitveno točko na glavni funkciji, zaženite naslednje ukaze: povratna sled, tiskanje, nadaljevati. V bistvu bo GDB najprej zagnal povratno sled, nato natisnil vrednost spremenljivke "N", nadaljeval z izvajanjem in končno zapustil.

Za izvedbo tega skripta uporabite:

gdb -x