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.
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:
- 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.
- 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.
- 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