Gdb nebo GNU Project Debugger je skvělý nástroj, když potřebujete ladit program. Můžete nastavit body přerušení, sledovat změnu hodnoty proměnné nebo dokonce změnit hodnotu programu, když je zastaven v určitém bodě svého stavu, a pak pokračovat a vybrat si některé funkce gdb.
V tomto tutoriálu nainstalujeme gdb na RHEL 8 a vyzkoušíme, jak funguje s jednoduchou C aplikací.
V tomto tutoriálu se naučíte:
- Jak nainstalovat gdb
- Jak zkompilovat jednoduchou C aplikaci se symboly ladění
- Jak nastavit body přerušení ve spuštěné aplikaci pomocí gdb
- Jak tisknout skutečné hodnoty daných proměnných v rámci aplikace
Krokování přes smyčku for s gdb.
Požadavky na software a použité konvence
Kategorie | Požadavky, konvence nebo použitá verze softwaru |
---|---|
Systém | Red Hat Enterprise Linux 8 |
Software | gdb 8.2 |
Jiné | Privilegovaný přístup k vašemu systému Linux jako root nebo prostřednictvím sudo příkaz. |
Konvence | # – vyžaduje, aby dané linuxové příkazy byly spouštěny s právy root buď přímo jako uživatel root, nebo pomocí sudo příkaz$ – vyžaduje, aby dané linuxové příkazy byly spouštěny jako běžný neprivilegovaný uživatel |
Jak nainstalovat gdb v Redhat Linux 8 krok za krokem
V tomto tutoriálu použijeme jednoduchou C aplikaci, která nastaví některé proměnné, vytiskne nějaký text a později změní hodnoty svých proměnných. Je vytvořen pouze pro zobrazení některých funkcí gdb
a nemá žádné skutečné použití.
Pokud nejste obeznámeni s programovacím jazykem C, můžete se podívat na úvod do vývoje C v Linuxu, abyste mohli začít. Prozatím zvažte následující zdrojový kód, který vložíme do vars.c
textový soubor:
#include <stdio.h>
int main()
{
int i = 1;
int j = 10;
printf("Variables set\n)";
i++;
j = 20;
printf("Variable values modified\n");
return 0;
}
Tento jednoduchý program použijeme k testování gdb
. Z kódu si můžete všimnout, že proměnné hodnot i
a j
take nebudou za normálního běhu programu nikdy vystaveny, takže nebudeme vědět, jaké jsou jejich hodnoty kde a kdy. V tomto případě je to jednoduché plýtvání pamětí, ale zamyslete se nad případem použití, kde i
by obsahovalo něco důležitého, možná pevně zakódované heslo, cheat kód nebo jiný poklad (nebo prostě nemůžete najít, kde jsou výpočty vašeho programu špatně).
gdb
je součástíDevelopment Tools
package group, takže pokud jste si nainstalovali vývojové nástroje, máte již gdb. Pokud ne, můžete jej nainstalovat sám:# dnf install gdb
Pro naše testy budeme také potřebovat debuginfo pro glibc:
# dnf debuginfo-install glibc-2.28-18.el8.x86_64
- Máme ladicí nástroj a máme zdrojový kód. Aby bylo ladění užitečné, musíme náš program zkompilovat se symboly ladění (přidáme
-g
option):$ gcc -g -o vars vars.c
Pokud spustíme naše
vars
vypíše řetězce vprintf
řádky, ale nezmiňujei
aj
podle očekávání.$ ./vars Variables set Variable values modified
- Potřebujeme znát hodnoty
i
aj
při prvním nastavení a před ukončením programu. Zvažte řádky #7 a #10 (printf
řádky) ve zdroji. Ideální by bylo, kdybychom mohli zastavit provádění na těchto řádcích, získat hodnoty, pak program znovu uvolnit atd. Přesně to uděláme, abychom otestovaligdb
. Začneme to zkompilovanýmvars
spustitelný jako argument:$ gdb vars GNU gdb (GDB) Red Hat Enterprise Linux 8.2-3.el8 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from vars...done. (gdb)
gdb
čte symboly v programu a dává nám výzvu k akci.vars
program v tomto okamžiku není spuštěn. Zkontrolujeme své poznámky a nastavímebreakpoint
na řádku #7:(gdb) break 7 Breakpoint 1 at 0x40059c: file vars.c, line 7.
A řádek #10:
(gdb) break 10 Breakpoint 2 at 0x4005b1: file vars.c, line 10.
S nastavenými body přerušení zahájíme provádění:
(gdb) run Starting program: /tmp/devel/vars Breakpoint 1, main () at vars.c:7 7 printf("Variables set\n");
Provádění se zastaví u prvního bodu přerušení a můžeme vytisknout hodnoty skrytých proměnných:
(gdb) print i $1 = 1 (gdb) print j $2 = 10
Získali jsme první část potřebných informací, pokračujeme v provádění:
(gdb) continue Continuing. Variables set Breakpoint 2, main () at vars.c:10 10 printf("Variable values modified\n");
Hodnoty můžeme vytisknout stejným způsobem u dalšího bodu přerušení:
(gdb) print i $3 = 2 (gdb) print j $4 = 20
Dostali jsme vše, co jsme potřebovali. Nezbývají žádné další zarážky, takže aplikace se po vytištění posledního řádku textu normálně ukončí.
(gdb) continue Continuing. Variable values modified [Inferior 1 (process 2330) exited normally] (gdb) q
Získali jsme hodnoty tajných proměnných a otestovali naše
gdb
je tak užitečný, jak má být.