Paranna koodin laatua ja estä odottamattomia tuloksia oppimalla käyttämään GNU Debuggeria paljastamaan ei-toivottuja virheitä koodissasi.
Virheenkorjaus on ohjelmoijille ja tietoturvatutkijoille välttämätön taito. Vahva käsitys virheenkorjauksesta antaa sinun ymmärtää suoritettavan tiedoston alemmalla tasolla ja havaita kaikki piilevät virheet.
GNU-debuggeri tai GDB on ajaton virheenkorjaustyökalu, johon ohjelmoijat ovat luottaneet jo vuosia. Näin voit käyttää GDB: tä Linuxissa.
Esimerkkiohjelmien valmistelu
GDB: n ominaisuuksien tutkimiseksi tarvitset suoritettavan tiedoston kokeilua varten. Esittelyä varten käytät GDB: tä avainten tarkistusohjelmalla kerran lähdekoodin ja virheenkorjaussymbolien kanssa, kerran ilman lähdekoodissa ja yksinkertaisessa monisäikeisessä ohjelmassa, joka tulostaa viestit näytölle, sekä C-kielellä kirjoitettuja että GCC: llä käännettyinä (GNU C Kääntäjä).
Sinä pystyt käytä mitä tahansa muuta C-kääntäjää mutta varo, ettet poista binääriä.
Käytät todennäköisesti GDB: tä omissa ohjelmissasi. Varmista siis, että käännät ne
-g merkitse gcc: llä ottaaksesi virheenkorjaussymbolit käyttöön.Ilman virheenkorjaussymboleita ja voimakkaasti kuoritun binaarin kanssa sinun on suoritettava virheenkorjaus ohjelman purkamisessa. Tämä edellyttää, että sinulla on vahva käsitys assembly-kielestä ja kuinka muistin varaus toimii Linuxissa ymmärtää pinossa ja rekistereissä olevia tietoja.
Ohjelman suorittaminen GDB: ssä
Voit suorittaa ohjelman GDB: ssä parilla tavalla. Joko kirjoita gdb , ja kun se latautuu, kirjoita juosta. Tai käynnistä gdb ja käytä sitten tiedosto komento, lataa binaari gdb: hen ja suorita se sitten komennolla juosta komento.
Jos ohjelmasi vaatii komentoriviargumentteja toimiakseen oikein, muista lisätä argumentit ohjelman nimen jälkeen. Tässä on syntaksi ohjelman lataamiseen GDB: hen ja sen suorittamiseen argumenteilla:
gdb
run
Tai:
gdb
file
run
Rajapisteiden asettaminen GDB: n avulla
Virheenkorjauksen keskeytyskohdat ovat manuaalisesti asetettuja kovia pysähdyksiä koodissa, jotka pysäyttävät suorituksen, kun ohjelma saavuttaa keskeytyskohdan. Asettamalla keskeytyspisteet voit siirtyä koodin läpi ja tarkastaa, kuinka kukin suoritusvaihe vaikuttaa tietoihin ja muuttujiin.
GDB: ssä, kun suoritat ohjelman virheenkorjausta virheenkorjaussymboleilla, voit joko asettaa keskeytyskohdan funktion nimellä tai asettaa keskeytyskohdan rivin numeron perusteella. Tässä on syntaksi:
break main
break 47
Näet kaikki keskeytyskohdat nykyisessä virheenkorjausistunnossa kirjoittamalla:
info breakpoints
Jos haluat poistaa tietyn tai useita keskeytyskohtia, kirjoita:
delete 2
delete 3-5
GDB mahdollistaa myös ehdollisten keskeytyspisteiden asettamisen, mikä tarkoittaa, että ohjelma pysähtyy vain, jos tietty ehto täyttyy suorituksen aikana. Se voi olla muuttujan arvon muutos tai epäonnistunut funktiokutsu tai mitä tahansa haluat. Tässä on syntaksi ehdollisten keskeytyspisteiden asettamiseen:
break if n == 2
Jos haluat jatkaa ohjelman suorittamista keskeytyskohtaan osumisen jälkeen, kirjoita jatkaa komento:
continue
Koodin läpi astuminen
Koodin läpi astuminen on ratkaisevan tärkeää ymmärtääksesi, miten ohjelma käsittelee tietoja. Selailemalla ohjelmasi eri toimintoja ja tutkimalla tietojen tilaa saat paremman käsityksen siitä, kuinka ohjelma toteuttaa koodissa kirjoittamaasi logiikkaa.
Se auttaa myös havaitsemaan kaatumisten syyn ja opinto-ohjelmien käyttäytymisen kirurgisella tarkkuudella, kun voit käydä läpi jokaisen koodirivin haluamallasi tavalla. Voit siirtyä koodin läpi kolmella ensisijaisella tavalla GDB: ssä:
- vaihe: Tämä komento käskee GDB: tä siirtymään lähdetiedoston seuraavalle riville. Tämä mahdollistaa olennaisesti lähdekoodin pituuden kulkemisen rivi riviltä.
- Seuraava: Tämä komento suorittaa seuraavan rivin lähdekoodia nykyisen funktion sisällä ja pysähtyy sitten. Seuraava käsittelee funktiota yhtenä rivinä, joten jos käytät seuraavaa ennen funktiokutsua, se käsittelee sitä yhtenä rivinä ja astuu sen yli, toisin kuin askel komento.
- suorittaa loppuun: Viimeistelykomento suorittaa kaikki jäljellä olevat rivit nykyisen funktion sisällä ja pysähtyy sitten.
Muuttujien tutkiminen
Kun siirryt koodin läpi, haluat tarkastella muuttujien arvoja nähdäksesi, kuinka ohjelman logiikka muuttaa niitä. Tässä on syntaksi GDB: n muuttujien arvon tarkastelemiseksi:
print
Jos haluat tulostaa muuttujan arvon muutokset aina, kun se päivitetään, käytä näyttökomentoa. Tämä on erityisen hyödyllistä, kun haluat seurata ja tulostaa muuttujan arvon silmukassa:
display
Tarkkailupisteiden asettaminen
Tarkkailupisteet ja ehdolliset keskeytyskohdat liittyvät läheisesti toisiinsa, koska ne molemmat vastaavat ohjelman muutoksiin. Tarkkailupisteitä käytetään koodin tietojen muutosten seuraamiseen. Voit esimerkiksi haluta ohjelman katkeavan aina, kun muuttujan arvo muuttuu. Näin voit tehdä sen GDB: n kanssa:
watch
Säiekohtainen virheenkorjaus GDB: n avulla
GDB mahdollistaa säiekohtaisen virheenkorjauksen, kun työskentelet monisäikeisten ohjelmien kanssa. Esittelyä varten työskentelemme yksinkertaisen C-ohjelman kanssa, joka käyttää neljää säiettä viestien tulostamiseen kunkin säikeen kanssa.
Voit tarkastella ohjelmassasi tällä hetkellä luotuja säikeitä käyttämällä tiedot komento:
info threads
Jos haluat käsitellä tiettyä säiettä, voit valita sen luettelosta käyttämällä sen indeksinumeroa. Esimerkiksi:
thread 2
Kun olet valinnut säikeen, voit siirtyä sen suorituskulun läpi käyttämällä askel, Seuraava, ja suorittaa loppuun komennot kuten yllä on esitetty.
Etävirheenkorjaus GDB: n avulla
Voit myös etäkorjata eri järjestelmässä olevia ohjelmia. Voit tehdä tämän määrittämällä kohdekoneelle gdbserverin. Voit asentaa sen helposti käyttämällä jakelusi oletuspaketinhallintaa tai muut asentamasi paketinhallintaohjelmat järjestelmässäsi.
Jos esimerkiksi haluat asentaa gdbserverin Ubuntu- tai Debian-pohjaisiin järjestelmiin, käytä APT: tä:
sudo apt install gdbserver
Kun olet asentanut, siirry binäärikansioon ja käynnistä gdbserver suorittamalla tämä komento:
gdbserver :
gdbserverin pitäisi palauttaa tulos, että se on päällä ja kuuntelee määrittämääsi porttia. Käynnistä GDB nyt asiakaskoneella ja muodosta sitten yhteys etäpalvelimeen käyttämällä kohde komento:
target remote :
GDB-komentosarjojen kirjoittaminen virheenkorjauksen automatisoimiseksi
GDB: n avulla ohjelmoijat voivat kirjoittaa GDB-skriptejä, jotka suorittavat GDB-komennot automaattisesti. Tämä auttaa valtavasti, kun yrität korjata samaa koodin osaa useita kertoja. Sen sijaan, että sinun tarvitsee asettaa keskeytyskohta, käydä läpi koodia ja tulostaa muuttujan arvot joka kerta, kun lataat binaarin, voit käyttää GDB-komentosarjaa automatisoidaksesi koko prosessin.
Tässä on esimerkki:
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
Yllä olevassa komentosarjassa käsket GDB: tä ottamaan kirjaamisen käyttöön ja tallentamaan lokin tiedostoon nimeltä sample.out, aseta sitten keskeytyspiste kohtaan pää toiminto.
Suorita seuraavat komennot keskeytyspisteelle numero 1, tässä tapauksessa funktion pään keskeytyspisteelle: jäljittää, Tulosta, jatkaa. Periaatteessa GDB suorittaa ensin paluujäljityksen, tulostaa sitten muuttujan "N" arvon, jatkaa suoritusta ja lopettaa lopuksi.
Suorita tämä komentosarja käyttämällä:
gdb -x