Parandage koodi kvaliteeti ja vältige ootamatuid tulemusi, õppides kasutama GNU silurit, et paljastada oma koodis soovimatud vead.
Silumine on programmeerijate ja turvauurijate jaoks asendamatu oskus. Silumisest tugev arusaam võimaldab teil mõista madalamal tasemel käivitatavat faili ja tuvastada kõik varitsevad vead.
GNU silur või GDB on ajatu silumistööriist, millele programmeerijad on juba aastaid tuginenud. Siit saate teada, kuidas GDB-d Linuxis kasutada.
Näidisprogrammide ettevalmistamine
GDB funktsioonide uurimiseks vajate katsetamiseks käivitatavat faili. Demonstreerimiseks kasutate GDB-d üks kord võtmekontrolli programmis, kus on saadaval lähtekood ja silumissümbolid, kord ilma lähtekoodis ja lihtsal mitmelõimelisel programmil, mis prindib ekraanile nii C-keeles kirjutatud kui ka GCC-ga (GNU C) kompileeritud teated Koostaja).
Sa saad kasutage mõnda muud C-kompilaatorit kuid ärge eemaldage binaarfaili.
Tõenäoliselt kasutate GDB-d oma programmides. Nii et kompileerige need kindlasti rakendusega -g silumissümbolite lubamiseks märgistada gcc-ga.
Ilma silumissümboliteta ja tugevalt eemaldatud kahendfailiga peate programmi lahtivõtmisel siluma. See nõuab teilt tugevat montaažikeele oskust ja kuidas mälu eraldamine Linuxis töötab virna ja registrite andmete mõistmiseks.
Programmi käitamine GDB-s
Käitate programmi GDB-s mitmel viisil. Sisestage kas gdb ja kui see laaditakse, tippige jooksma. Või käivitage gdb ja seejärel kasutage faili käsk, laadige binaarfail gdb-sse ja käivitage see käsuga jooksma käsk.
Kui teie programm vajab korrektseks toimimiseks käsurea argumente, lisage need kindlasti programmi nime järele. Siin on süntaks programmi GDB-sse laadimiseks ja selle käivitamiseks argumentidega:
gdb
run
Või:
gdb
file
run
Katkestuspunktide määramine GDB-ga
Silumise katkestuspunktid on koodis käsitsi seatud rasked peatused, mis peatavad täitmise voo, kui programm jõuab katkestuspunkti. Katkestuspunktide määramine võimaldab teil koodi läbi astuda ja kontrollida, kuidas iga täitmise etapp mõjutab andmeid ja muutujaid.
GDB-s saate silumissümbolitega programmi silumisel määrata katkestuspunkti funktsiooni nime järgi või määrata katkestuspunkti rea numbri alusel. Siin on süntaks:
break main
break 47
Kõigi praeguse silumiseansi katkestuspunktide vaatamiseks tippige:
info breakpoints
Konkreetse või mitme katkestuspunkti kustutamiseks tippige:
delete 2
delete 3-5
GDB võimaldab teil määrata ka tingimuslikke katkestuspunkte, mis tähendab, et programm peatub ainult siis, kui konkreetne tingimus on täitmise ajal täidetud. See võib olla muutuja väärtuse muutus või ebaõnnestunud funktsioonikutse või kõik, mida soovite. Siin on tingimuslike katkestuspunktide määramise süntaks:
break if n == 2
Kui soovite jätkata programmi täitmist pärast katkestuspunkti tabamist, tippige jätka käsk:
continue
Koodi läbimine
Koodi läbimine on ülioluline, et mõista, kuidas programm andmeid käsitleb. Astudes läbi oma programmi erinevatest funktsioonidest ja uurides andmete olekut, saate paremini mõista, kuidas programm teie koodis kirjutatud loogikat rakendab.
Samuti aitab see teil kirurgilise täpsusega tuvastada krahhide algpõhjuseid ja õppeprogrammi käitumist, kuna saate iga koodirida vastavalt oma soovidele läbida. GDB-s saate koodi läbida kolmel peamisel viisil.
- samm: See käsk käsib GDB-l astuda lähtefaili järgmisele reale. See võimaldab sisuliselt läbida lähtekoodi pikkuse rida-realt.
- järgmine: See käsk käivitab praeguse funktsiooni sees lähtekoodi järgmise rea ja seejärel peatub. järgmiseks kohtleb funktsiooni ühe reana, nii et kui kasutate funktsiooni järgmist enne funktsiooni kutsumist, käsitleb see seda ühe reana ja astub sellest üle, erinevalt samm käsk.
- lõpetama: Lõpetamiskäsk täidab kõik praeguse funktsiooni ülejäänud read ja seejärel peatub.
Muutujate uurimine
Koodi läbimisel peaksite uurima muutujate väärtust, et näha, kuidas programmi loogika neid muudab. Siin on süntaks GDB muutujate väärtuste vaatamiseks:
print
Kui soovite printida muutuja väärtuse muutused iga kord, kui seda värskendatakse, peaksite kasutama kuvamiskäsku. See on eriti kasulik, kui soovite jälgida ja printida tsükli muutuja väärtust:
display
Jälgimispunktide määramine
Jälgimispunktid ja tingimuslikud katkestuspunktid on omavahel tihedalt seotud, kuna mõlemad reageerivad programmi muudatustele. Jälgimispunkte kasutatakse koodis olevate andmete muutuste jälgimiseks. Näiteks võite soovida, et programm katkeks muutuja väärtuse muutumisel. GDB-ga saate seda teha järgmiselt.
watch
Lõimepõhine silumine GDB-ga
GDB võimaldab mitme lõimega programmidega töötamisel teostada lõimespetsiifilist silumist. Demonstreerimiseks töötame lihtsa C-programmiga, mis kasutab iga lõimega sõnumite printimiseks nelja lõime.
Oma programmis praegu loodud lõimede vaatamiseks kasutage info käsk:
info threads
Konkreetse lõimega töötamiseks saate selle loendist valida indeksinumbri abil. Näiteks:
thread 2
Pärast lõime valimist saate selle täitmisvoo läbida, kasutades nuppu samm, järgmiseksja lõpetama käske, nagu ülal näidatud.
Kaugsilumine GDB-ga
Samuti saate kaugsiluda teises süsteemis asuvaid programme. Selleks peate sihtmasinas seadistama gdbserveri. Saate selle hõlpsalt installida, kasutades oma distributsiooni vaikepaketihaldurit või muud installitud paketihaldurid teie süsteemis.
Näiteks gdbserveri installimiseks oma Ubuntu või Debiani-põhistesse süsteemidesse kasutage APT-d:
sudo apt install gdbserver
Pärast installimist liikuge binaarfaili kausta ja käivitage see käsk, et käivitada gdbserver:
gdbserver :
gdbserver peaks tagastama väljundi, et see on üleval ja kuulab teie määratletud pordis. Käivitage nüüd kliendimasinas GDB ja seejärel looge ühendus kaugserveriga, kasutades sihtmärk käsk:
target remote :
GDB skriptide kirjutamine silumise automatiseerimiseks
GDB võimaldab programmeerijatel kirjutada GDB skripte, mis täidavad GDB käske automaatselt. See aitab tohutult, kui proovite sama koodiosa mitu korda siluda. Selle asemel, et määrata katkestuspunkt, liikuda koodi kaudu ja printida muutujate väärtusi iga kord, kui binaarfaili laadite, saate kogu protsessi automatiseerimiseks kasutada GDB skripti.
Siin on näide:
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
Ülaltoodud skriptis käsite GDB-l logida sisse logida ja salvestada logi faili nimega sample.out, seejärel määrake katkestuspunkt peamine funktsiooni.
Katkestuspunkti number 1, antud juhul funktsiooni main murdepunkti jaoks, käivitage järgmised käsud: tagajälg, printida, jätka. Põhimõtteliselt käivitab GDB esmalt tagasijälituse, seejärel prindib muutuja "N" väärtuse, jätkab täitmist ja lõpuks väljub.
Selle skripti käivitamiseks kasutage:
gdb -x