Pagerinkite kodo kokybę ir išvengsite netikėtų rezultatų mokydamiesi naudoti GNU Debugger, kad atskleistumėte nepageidaujamas kodo klaidas.
Derinimas yra nepakeičiamas programuotojų ir saugumo tyrinėtojų įgūdis. Turėdami tvirtą derinimo supratimą, galite suprasti vykdomąjį failą žemesniu lygiu ir užfiksuoti visas slypinčias klaidas.
GNU derinimo priemonė arba GDB yra nesenstantis derinimo įrankis, kuriuo programuotojai naudojasi jau daugelį metų. Štai kaip naudoti GDB sistemoje „Linux“.
Pavyzdinių programų ruošimas
Norėdami ištirti GDB funkcijas, jums reikės vykdomosios programos, su kuria galėtumėte eksperimentuoti. Norėdami parodyti, vieną kartą paleisite GDB naudodami raktų tikrinimo programą su šaltinio kodu ir derinimo simboliais, vieną kartą be šaltinio kodą ir paprastą daugiasriegią programą, kuri spausdina pranešimus į ekraną, parašytus C ir sukompiliuotus su GCC (GNU C Kompiliatorius).
Tu gali naudokite bet kurį kitą C kompiliatorių bet įsitikinkite, kad dvejetainio nepanaikinate.
Greičiausiai naudosite GDB savo programose. Taigi būtinai sukompiliuokite juos su -g pažymėkite su gcc, kad įgalintumėte derinimo simbolius.
Jei nėra derinimo simbolių ir labai nuimtas dvejetainis failas, turėsite derinti programos išardymą. Tam reikės gerai mokėti surinkimo kalbą ir kaip veikia atminties paskirstymas Linux sistemoje suprasti kamino ir registrų duomenis.
Programos vykdymas GDB
Programą GDB paleidžiate keliais būdais. Įveskite arba gdb , ir kai jis bus įkeltas, įveskite paleisti. Arba paleiskite gdb ir tada naudokite failą komandą, įkelkite dvejetainį failą į gdb ir paleiskite jį naudodami paleisti komandą.
Jei jūsų programai reikia komandinės eilutės argumentų, kad tinkamai veiktų, įsitikinkite, kad po programos pavadinimo pridėkite argumentus. Čia yra programos įkėlimo į GDB ir jos vykdymo su argumentais sintaksė:
gdb
run
Arba:
gdb
file
run
Lūžio taškų nustatymas naudojant GDB
Derinimo lūžio taškai yra rankiniu būdu nustatomi griežti kodo sustabdymai, kurie sustabdo vykdymo eigą, kai programa pasiekia lūžio tašką. Nustačius lūžio taškus, galite pereiti per kodą ir patikrinti, kaip kiekvienas vykdymo etapas veikia duomenis ir kintamuosius.
GDB, kai derinate programą su derinimo simboliais, galite nustatyti pertraukos tašką pagal funkcijos pavadinimą arba nustatyti pertraukos tašką pagal eilutės numerį. Štai sintaksė:
break main
break 47
Norėdami peržiūrėti visus dabartinės derinimo seanso lūžio taškus, įveskite:
info breakpoints
Norėdami ištrinti konkrečią ar kelis pertraukos taškus, įveskite:
delete 2
delete 3-5
GDB taip pat leidžia nustatyti sąlyginius lūžio taškus, tai reiškia, kad programa sustos tik tuo atveju, jei vykdymo metu bus įvykdyta tam tikra sąlyga. Tai gali būti kintamojo vertės pasikeitimas arba nesėkmingas funkcijos iškvietimas arba bet kas, ko norite. Štai sintaksė sąlyginiams lūžio taškams nustatyti:
break if n == 2
Jei norite tęsti programos vykdymą pasiekę pertraukos tašką, įveskite Tęsti komanda:
continue
Žingsnis per kodą
Norint suprasti, kaip programa tvarko duomenis, labai svarbu pereiti per kodą. Peržiūrėdami įvairias programos funkcijas ir išnagrinėję duomenų būseną, galite geriau suprasti, kaip programa įgyvendina logiką, kurią parašėte kode.
Tai taip pat padeda chirurginiu tikslumu aptikti gedimų priežastis ir studijų programos elgesį, nes galite pereiti per kiekvieną kodo eilutę, kaip norite. GDB galite pereiti per kodą trimis pagrindiniais būdais:
- žingsnis: Ši komanda nurodo GDB pereiti į kitą šaltinio failo eilutę. Tai leidžia iš esmės pereiti šaltinio kodo ilgį eilutė po eilutės.
- Kitas: Ši komanda vykdo kitą šaltinio kodo eilutę dabartinės funkcijos viduje ir sustoja. Kitas traktuoja funkciją kaip vieną eilutę, taigi, jei naudosite kitą prieš funkcijos iškvietimą, ji traktuos ją kaip vieną eilutę ir peržengs ją, skirtingai nei žingsnis komandą.
- baigti: Komanda baigti vykdo visas likusias dabartinės funkcijos eilutes ir sustoja.
Nagrinėjant kintamuosius
Pereinant per kodą, norėtumėte ištirti kintamųjų reikšmę, kad pamatytumėte, kaip programos logika juos keičia. Štai sintaksė, skirta peržiūrėti kintamųjų reikšmę GDB:
print
Jei norite spausdinti kintamojo vertės pokyčius kiekvieną kartą, kai jis atnaujinamas, turėtumėte naudoti ekrano komandą. Tai ypač naudinga, kai norite sekti ir spausdinti ciklo kintamojo reikšmę:
display
Stebėjimo taškų nustatymas
Stebėjimo taškai ir sąlyginiai lūžio taškai yra glaudžiai susiję, nes jie abu reaguoja į programos pokyčius. Stebėjimo taškai naudojami duomenų pasikeitimams kode stebėti. Pavyzdžiui, galbūt norėsite, kad programa nutrūktų, kai pasikeičia kintamojo reikšmė. Štai kaip tai padaryti naudojant GDB:
watch
Specialus gijų derinimas naudojant GDB
GDB leidžia atlikti konkrečių gijų derinimą dirbant su daugiagijomis programomis. Norėdami parodyti, dirbsime su paprasta C programa, kuri naudoja keturias gijas, kad spausdintų pranešimus su kiekviena gija.
Norėdami peržiūrėti šiuo metu sukurtas savo programos gijas, naudokite informacija komanda:
info threads
Norėdami dirbti su konkrečia gija, galite ją pasirinkti iš sąrašo naudodami indekso numerį. Pavyzdžiui:
thread 2
Pasirinkę giją, galite pereiti jos vykdymo eigą naudodami žingsnis, Kitas, ir baigti komandas, kaip parodyta aukščiau.
Nuotolinis derinimas naudojant GDB
Taip pat galite nuotoliniu būdu derinti programas, esančias kitoje sistemoje. Norėdami tai padaryti, tiksliniame kompiuteryje turite nustatyti gdbserver. Galite lengvai jį įdiegti naudodami numatytąją savo platinimo paketų tvarkyklę arba kitos jūsų įdiegtos paketų tvarkyklės jūsų sistemoje.
Pavyzdžiui, norėdami įdiegti gdbserver Ubuntu arba Debian pagrindu veikiančiose sistemose, naudokite APT:
sudo apt install gdbserver
Įdiegę pereikite prie dvejetainio aplanko ir paleiskite šią komandą, kad paleistumėte gdbserver:
gdbserver :
gdbserver turėtų grąžinti išvestį, kad ji veikia ir klausosi jūsų apibrėžtame prievade. Dabar kliento kompiuteryje paleiskite GDB ir prisijunkite prie nuotolinio serverio naudodami taikinys komanda:
target remote :
GDB scenarijų rašymas, siekiant automatizuoti derinimą
GDB leidžia programuotojams rašyti GDB scenarijus, kurie automatiškai vykdys GDB komandas. Tai labai padeda, kai bandote kelis kartus derinti tą pačią kodo dalį. Užuot nustatę pertraukos tašką, pereidami per kodą ir spausdindami kintamųjų reikšmes kiekvieną kartą įkeldami dvejetainį failą, galite naudoti GDB scenarijų visam procesui automatizuoti.
Štai pavyzdys:
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
Aukščiau esančiame scenarijuje nurodote GDB įjungti registravimą ir išsaugoti žurnalą faile, vadinamame sample.out, tada nustatykite pertraukos tašką pagrindinis funkcija.
Nutraukimo taško numeris 1, šiuo atveju pagrindinės funkcijos lūžio taškas, paleiskite šias komandas: atgalinis pėdsakas, spausdinti, Tęsti. Iš esmės GDB pirmiausia paleis atgalinį sekimą, tada išspausdins kintamojo "N" reikšmę, tęs vykdymą ir galiausiai baigsis.
Norėdami paleisti šį scenarijų, naudokite:
gdb -x