Zlepšete kvalitu kódu a předcházejte neočekávaným výsledkům tím, že se naučíte používat GNU Debugger k odhalení nežádoucích chyb ve vašem kódu.

Ladění je nepostradatelná dovednost pro programátory a bezpečnostní výzkumníky. Dobrá znalost ladění vám umožňuje porozumět spustitelnému souboru na nižší úrovni a zachytit všechny skryté chyby.

GNU debugger neboli GDB je nadčasový ladicí nástroj, na který se programátoři spoléhají již léta. Zde je návod, jak používat GDB v Linuxu.

Příprava ukázkových programů

Chcete-li prozkoumat funkce GDB, budete potřebovat spustitelný soubor, se kterým budete experimentovat. Pro ukázku spustíte GDB na programu pro kontrolu klíčů jednou s dostupným zdrojovým kódem a symboly ladění, jednou bez zdrojový kód a na jednoduchém vícevláknovém programu, který tiskne zprávy na obrazovku, jak napsané v C, tak kompilované pomocí GCC (GNU C kompilátor).

Můžeš použijte jakýkoli jiný kompilátor C ale ujistěte se, že neodstraňujte binární soubor.

S největší pravděpodobností budete GDB provozovat na svých vlastních programech. Ujistěte se tedy, že je zkompilujete pomocí

instagram viewer
-G příznak s gcc pro povolení symbolů ladění.

Bez přítomných symbolů ladění a se silně oříznutým binárním souborem budete muset odladit demontáž programu. To bude vyžadovat, abyste měli dobrou znalost jazyka symbolických instrukcí jak funguje alokace paměti v Linuxu porozumět datům v zásobníku a registrech.

Spuštění programu v GDB

Program v GDB spouštíte několika způsoby. Buď zadejte gdb , a jakmile se načte, zadejte běh. Nebo spusťte gdb a poté použijte soubor příkaz, načtěte binární soubor do gdb a poté jej spusťte pomocí běh příkaz.

Pokud váš program vyžaduje ke správné funkci argumenty příkazového řádku, nezapomeňte je přidat za název programu. Zde je syntaxe pro načtení programu do GDB a jeho spuštění s argumenty:

gdb 
run

Nebo:

gdb
file
run

Nastavení bodů zlomu s GDB

Body přerušení v ladění jsou ručně nastavené pevné zastávky v kódu, které zastaví tok provádění, když program dosáhne bodu přerušení. Nastavení bodů přerušení vám umožňuje procházet kódem a kontrolovat, jak každá fáze provádění ovlivňuje data a proměnné.

V GDB, když ladíte program pomocí ladicích symbolů, můžete buď nastavit zarážku podle názvu funkce, nebo nastavit zarážku na základě čísla řádku. Zde je syntaxe:

break main
break 47

Chcete-li zobrazit všechny body přerušení v aktuální relaci ladění, zadejte:

info breakpoints

Chcete-li odstranit konkrétní bod přerušení nebo více bodů přerušení, zadejte:

delete 2
delete 3-5

GDB také umožňuje nastavit podmíněné body přerušení, což znamená, že program se zastaví pouze tehdy, pokud je během provádění splněna určitá podmínka. Může to být změna hodnoty proměnné nebo neúspěšné volání funkce nebo cokoliv chcete. Zde je syntaxe pro nastavení podmíněných zarážek:

break  if n == 2

Pokud si přejete pokračovat ve vykonávání programu po dosažení bodu přerušení, zadejte pokračovat příkaz:

continue

Krokování přes kód

Procházení kódu je zásadní pro pochopení toho, jak program zachází s daty. Procházením různých funkcí ve vašem programu a zkoumáním stavu dat můžete lépe porozumět tomu, jak program implementuje logiku, kterou jste napsali v kódu.

Pomáhá vám také odhalit příčinu selhání a chování studijního programu s chirurgickou přesností, protože můžete procházet každým řádkem kódu, jak si přejete. Kód můžete v GDB procházet třemi hlavními způsoby:

  1. krok: Tento příkaz říká GDB, aby přešel na další řádek zdrojového souboru. To vám umožňuje v podstatě procházet délku zdrojového kódu řádek po řádku.
  2. další: Tento příkaz provede další řádek zdrojového kódu uvnitř aktuální funkce a poté se zastaví. další zachází s funkcí jako s jedním řádkem, takže pokud použijete next před voláním funkce, bude to považovat za jeden řádek a překročí ho, na rozdíl od krok příkaz.
  3. Dokončit: Příkaz dokončit provede všechny zbývající řádky uvnitř aktuální funkce a poté se zastaví.

Zkoumání proměnných

Při procházení kódu byste chtěli prozkoumat hodnotu proměnných, abyste viděli, jak je logika programu mění. Zde je syntaxe pro zobrazení hodnoty proměnných v GDB:

print 

V případě, že si přejete vytisknout změny hodnoty proměnné při každé její aktualizaci, měli byste použít příkaz display. To je zvláště užitečné, když chcete sledovat a tisknout hodnotu proměnné ve smyčce:

display 

Nastavení hlídacích bodů

Sledované body a podmíněné body přerušení spolu úzce souvisí, protože oba reagují na změny v programu. Watchpoints se používají ke sledování změn v datech v kódu. Můžete například chtít, aby se program přerušil, kdykoli se změní hodnota proměnné. Zde je návod, jak to udělat s GDB:

watch 

Ladění specifické pro vlákno s GDB

GDB umožňuje provádět ladění specifické pro vlákna při práci s vícevláknovými programy. Pro demonstraci budeme pracovat s jednoduchým programem C, který používá čtyři vlákna k tisku zpráv s každým vláknem.

Chcete-li zobrazit aktuálně vytvořená vlákna ve vašem programu, použijte info příkaz:

info threads

Chcete-li pracovat s konkrétním vláknem, můžete jej vybrat ze seznamu pomocí jeho indexového čísla. Například:

thread 2

Po výběru vlákna můžete procházet průběhem jeho provádění pomocí krok, další, a Dokončit příkazy, jak je ukázáno výše.

Vzdálené ladění s GDB

Můžete také vzdáleně ladit programy umístěné na jiném systému. Chcete-li tak učinit, musíte na cílovém počítači nastavit gdbserver. Snadno jej nainstalujete pomocí výchozího správce balíčků vaší distribuce resp další správce balíčků, které jste nainstalovali na vašem systému.

Chcete-li například nainstalovat gdbserver na systémy založené na Ubuntu nebo Debianu, použijte APT:

sudo apt install gdbserver

Po instalaci se přesuňte do složky binárního souboru a spusťte tento příkaz pro spuštění gdbserver:

gdbserver :

gdbserver by měl vrátit výstup, že je aktivní a naslouchá na vámi definovaném portu. Nyní na klientském počítači spusťte GDB a poté se připojte ke vzdálenému serveru pomocí cílová příkaz:

target remote :

Psaní GDB skriptů pro automatizaci ladění

GDB umožňuje programátorům psát GDB skripty, které budou GDB příkazy spouštět automaticky. To nesmírně pomáhá, když se pokoušíte ladit stejnou část kódu vícekrát. Místo toho, abyste museli nastavovat bod přerušení, procházet kódem a tisknout hodnoty proměnných pokaždé, když načtete binární soubor, můžete celý proces automatizovat pomocí skriptu GDB.

Zde je příklad:

set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit

Ve výše uvedeném skriptu říkáte GDB, aby povolila protokolování a uložila protokol do souboru s názvem vzorek.ven, poté nastavte bod přerušení na hlavní funkce.

Pro bod přerušení číslo 1, v tomto případě bod přerušení ve funkci main, spusťte následující příkazy: zpětná stopa, tisk, pokračovat. GDB v podstatě nejprve spustí backtrace, pak vytiskne hodnotu proměnné "N", bude pokračovat v provádění a nakonec se ukončí.

Chcete-li spustit tento skript, použijte:

gdb -x