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

instagram viewer
-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:

  1. 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.
  2. Ď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.
  3. 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