Zlepšite kvalitu kódu a zabráňte neočakávaným výsledkom tým, že sa naučíte používať GNU Debugger na odhalenie nechcených chýb vo vašom kóde.
Ladenie je nepostrádateľnou zručnosťou pre programátorov a bezpečnostných výskumníkov. Dobrá znalosť ladenia vám umožňuje pochopiť spustiteľný súbor na nižšej úrovni a zachytiť všetky číhajúce chyby.
Debugger GNU alebo GDB je nadčasový nástroj na ladenie, na ktorý sa programátori spoliehajú už roky. Tu je návod, ako používať GDB v systéme Linux.
Príprava vzorových programov
Ak chcete preskúmať funkcie GDB, budete potrebovať spustiteľný súbor, s ktorým budete experimentovať. Na ukážku spustíte GDB na programe na kontrolu kľúčov raz s dostupným zdrojovým kódom a symbolmi ladenia, raz bez zdrojový kód a na jednoduchom viacvláknovom programe, ktorý tlačí správy na obrazovku, napísané v C a skompilované pomocou GCC (GNU C kompilátor).
Môžeš použite akýkoľvek iný kompilátor C ale uistite sa, že neodstraňujte binárne číslo.
S najväčšou pravdepodobnosťou budete používať GDB na svojich vlastných programoch. Nezabudnite ich teda skompilovať pomocou súboru
-g príznak s gcc na povolenie symbolov ladenia.Bez prítomných symbolov ladenia a so značne orezaným binárnym súborom budete musieť odladiť demontáž programu. To si bude vyžadovať, aby ste dobre ovládali jazyk symbolických inštancií a ako funguje prideľovanie pamäte v systéme Linux na pochopenie údajov v zásobníku a registroch.
Spustenie programu v GDB
Program v GDB spustíte niekoľkými spôsobmi. Buď zadajte gdb a keď sa načíta, napíšte behať. Alebo spustite gdb a potom použite súbor príkaz, načítajte binárny súbor do gdb a potom ho spustite pomocou príkazu behať príkaz.
Ak váš program vyžaduje na správne fungovanie argumenty príkazového riadka, nezabudnite ich pridať za názov programu. Tu je syntax pre načítanie programu do GDB a jeho spustenie s argumentmi:
gdb
run
alebo:
gdb
file
run
Nastavenie bodov zlomu s GDB
Body prerušenia v ladení sú manuálne nastavené pevné zastavenia v kóde, ktoré zastavia tok vykonávania, keď program dosiahne bod prerušenia. Nastavenie bodov prerušenia vám umožňuje prechádzať kódom a kontrolovať, ako každá fáza vykonávania ovplyvňuje údaje a premenné.
V GDB, keď ladíte program pomocou ladiacich symbolov, môžete buď nastaviť bod prerušenia podľa názvu funkcie alebo nastaviť bod prerušenia na základe čísla riadku. Tu je syntax:
break main
break 47
Ak chcete zobraziť všetky body prerušenia v aktuálnej relácii ladenia, zadajte:
info breakpoints
Ak chcete odstrániť konkrétny bod prerušenia alebo viacero bodov prerušenia, zadajte:
delete 2
delete 3-5
GDB vám tiež umožňuje nastaviť podmienené body prerušenia, čo znamená, že program sa zastaví iba vtedy, ak je počas vykonávania splnená určitá podmienka. Môže to byť zmena hodnoty premennej alebo neúspešné volanie funkcie alebo čokoľvek, čo chcete. Tu je syntax na nastavenie podmienených prerušení:
break if n == 2
Ak chcete pokračovať vo vykonávaní programu po dosiahnutí bodu prerušenia, zadajte ďalej príkaz:
continue
Krokovanie cez kód
Prechod cez kód je rozhodujúci pre pochopenie toho, ako program narába s údajmi. Prechádzaním rôznymi funkciami vo vašom programe a skúmaním stavu údajov môžete lepšie pochopiť, ako program implementuje logiku, ktorú ste napísali v kóde.
Tiež vám pomôže odhaliť príčinu zlyhaní a správanie študijného programu s chirurgickou presnosťou, pretože môžete prechádzať každým riadkom kódu, ako chcete. Kód môžete v GDB prechádzať tromi hlavnými spôsobmi:
- krok: Tento príkaz povie GDB, aby vstúpila na ďalší riadok zdrojového súboru. To vám umožňuje v podstate prejsť po dĺžke zdrojového kódu riadok po riadku.
- Ďalšie: Tento príkaz spustí ďalší riadok zdrojového kódu v rámci aktuálnej funkcie a potom sa zastaví. Ďalšie zaobchádza s funkciou ako s jedným riadkom, takže ak použijete next pred volaním funkcie, bude to považovať za jeden riadok a prekročí ho, na rozdiel od krok príkaz.
- skončiť: Príkaz dokončiť vykoná všetky zostávajúce riadky v rámci aktuálnej funkcie a potom sa zastaví.
Skúmanie premenných
Keď budete prechádzať kódom, budete chcieť preskúmať hodnotu premenných, aby ste videli, ako ich logika programu mení. Tu je syntax na zobrazenie hodnoty premenných v GDB:
print
V prípade, že chcete vytlačiť zmeny v hodnote premennej pri každej jej aktualizácii, mali by ste použiť príkaz display. Toto je obzvlášť užitočné, keď chcete sledovať a tlačiť hodnotu premennej v slučke:
display
Nastavenie sledovaných bodov
Body sledovania a podmienené body prerušenia spolu úzko súvisia, pretože obe reagujú na zmeny v programe. Watchpointy sa používajú na sledovanie zmien údajov v kóde. Môžete napríklad chcieť, aby sa program prerušil vždy, keď sa zmení hodnota premennej. Tu je návod, ako to urobiť s GDB:
watch
Ladenie špecifické pre vlákna s GDB
GDB vám umožňuje vykonávať ladenie špecifické pre vlákna pri práci s viacvláknovými programami. Na ukážku budeme pracovať s jednoduchým programom C, ktorý používa štyri vlákna na tlač správ s každým vláknom.
Ak chcete zobraziť aktuálne vytvorené vlákna vo vašom programe, použite príkaz Info príkaz:
info threads
Ak chcete pracovať s konkrétnym vláknom, môžete ho vybrať zo zoznamu pomocou jeho indexového čísla. Napríklad:
thread 2
Po výbere vlákna môžete prejsť jeho priebehom vykonávania pomocou krok, Ďalšie, a skončiť príkazy, ako je uvedené vyššie.
Vzdialené ladenie s GDB
Môžete tiež vzdialene ladiť programy umiestnené na inom systéme. Ak to chcete urobiť, musíte na cieľovom počítači nastaviť gdbserver. Môžete si ho jednoducho nainštalovať pomocou predvoleného správcu balíkov vašej distribúcie resp iných správcov balíkov, ktorých ste nainštalovali na vašom systéme.
Napríklad, ak chcete nainštalovať gdbserver na vaše systémy založené na Ubuntu alebo Debiane, použite APT:
sudo apt install gdbserver
Po inštalácii sa presuňte do priečinka binárneho súboru a spustite tento príkaz na spustenie gdbserver:
gdbserver :
gdbserver by mal vrátiť výstup, že je zapnutý a počúva na porte, ktorý ste definovali. Teraz na klientskom počítači spustite GDB a potom sa pripojte k vzdialenému serveru pomocou cieľ príkaz:
target remote :
Písanie GDB skriptov na automatizáciu ladenia
GDB umožňuje programátorom písať GDB skripty, ktoré budú spúšťať GDB príkazy automaticky. To nesmierne pomáha, keď sa pokúšate ladiť rovnakú časť kódu viackrát. Namiesto toho, aby ste museli nastavovať bod prerušenia, prechádzať kódom a tlačiť hodnoty premenných pri každom načítaní binárneho súboru, môžete použiť skript GDB na automatizáciu celého procesu.
Tu je príklad:
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
Vo vyššie uvedenom skripte hovoríte GDB, aby povolila protokolovanie a uložila protokol do súboru s názvom vzorka.out, potom nastavte bod prerušenia na Hlavná funkciu.
Pre bod prerušenia číslo 1, v tomto prípade bod prerušenia vo funkcii main, spustite nasledujúce príkazy: spätná stopa, vytlačiť, ďalej. GDB v podstate najskôr spustí spätné sledovanie, potom vypíše hodnotu premennej "N", bude pokračovať vo vykonávaní a nakoniec sa ukončí.
Ak chcete spustiť tento skript, použite:
gdb -x