GdB o GNU Project Debugger è un ottimo strumento quando è necessario eseguire il debug di un programma. Puoi impostare punti di interruzione, osservare la modifica del valore di una variabile o persino modificare un valore per il programma mentre è interrotto in un punto del suo stato, quindi continuare, solo per selezionare alcune delle funzionalità di gdb.
In questo tutorial installeremo gdb su RHEL 8 e testeremo come funziona con una semplice applicazione C.
In questo tutorial imparerai:
- Come installare gdb
- Come compilare una semplice applicazione C con simboli di debug
- Come impostare punti di interruzione nell'applicazione in esecuzione con gdb
- Come stampare i valori effettivi di determinate variabili all'interno dell'applicazione

Requisiti e convenzioni software utilizzati
Categoria | Requisiti, convenzioni o versione del software utilizzata |
---|---|
Sistema | Red Hat Enterprise Linux 8 |
Software | gb 8.2 |
Altro | Accesso privilegiato al tuo sistema Linux come root o tramite sudo comando. |
Convenzioni | # – richiede che i comandi linux dati vengano eseguiti con i privilegi di root direttamente come utente root o usando sudo comando$ – richiede che i comandi linux dati vengano eseguiti come un normale utente non privilegiato |
Come installare gdb in Redhat Linux 8 istruzioni passo passo
Per questo tutorial, utilizzeremo una semplice applicazione C che imposta alcune variabili, stampa del testo e modifica i valori delle sue variabili in un secondo momento. È costruito solo per mostrare alcune funzionalità di gdb
e non ha alcun utilizzo nel mondo reale.
Se non hai familiarità con il linguaggio di programmazione C, puoi dare un'occhiata allo sviluppo C su Linux Introduzione per iniziare. Per ora consideriamo il seguente codice sorgente, che inseriremo nel vars.c
file di testo:
#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;
}
Useremo questo semplice programma per testare gdb
. Puoi notare dal codice che le variabili di valori i
e j
take non verrà mai esposto durante il normale funzionamento del programma, quindi non sapremo quali sono i loro valori dove e quando. In questo caso è un semplice spreco di memoria, ma pensa a un caso d'uso in cui i
conterrebbe qualcosa di importante, forse una password codificata, un cheat-code o un altro tesoro (o semplicemente non riesci a trovare dove i calcoli del tuo programma vanno male).
gdb
fa parte degliDevelopment Tools
gruppo di pacchetti, quindi se hai installato gli strumenti di sviluppo, hai già gdb. In caso contrario, puoi installarlo da solo:# dnf install gdb
Avremo anche bisogno di debuginfo per glibc per i nostri test:
# dnf debuginfo-install glibc-2.28-18.el8.x86_64
- Abbiamo lo strumento debugger e il codice sorgente. Affinché il debug sia utile, dobbiamo compilare il nostro programma con simboli di debug (aggiungiamo il
-g
opzione):$ gcc -g -o vars vars.c
Se eseguiamo il nostro
vars
programma, produrrà le stringhe nelprintf
righe, ma non menzionerài
ej
, come previsto.$ ./vars Variables set Variable values modified
- Dobbiamo conoscere i valori di
i
ej
quando sono stati impostati per la prima volta e prima dell'uscita del programma. Considera le righe #7 e #10 (ilprintf
righe) nella sorgente. Sarebbe l'ideale se potessimo interrompere l'esecuzione su quelle righe, ottenere i valori, quindi lasciare che il programma si allenta di nuovo, ecc. Lo faremo esattamente per testaregdb
. Iniziamo con il compilatovars
eseguibile come argomento:$ 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
legge i simboli nel programma e ci dà la richiesta di agire. Levars
il programma non è avviato a questo punto. Controlliamo le nostre note e impostiamo unbreakpoint
alla riga n. 7:(gdb) break 7 Breakpoint 1 at 0x40059c: file vars.c, line 7.
E riga #10:
(gdb) break 10 Breakpoint 2 at 0x4005b1: file vars.c, line 10.
Con i breakpoint impostati, iniziamo l'esecuzione:
(gdb) run Starting program: /tmp/devel/vars Breakpoint 1, main () at vars.c:7 7 printf("Variables set\n");
L'esecuzione si ferma al primo punto di interruzione e possiamo stampare i valori delle variabili nascoste:
(gdb) print i $1 = 1 (gdb) print j $2 = 10
Abbiamo ottenuto la prima parte delle informazioni necessarie, continuiamo l'esecuzione:
(gdb) continue Continuing. Variables set Breakpoint 2, main () at vars.c:10 10 printf("Variable values modified\n");
Possiamo stampare i valori allo stesso modo al punto di interruzione successivo:
(gdb) print i $3 = 2 (gdb) print j $4 = 20
Abbiamo tutto ciò di cui avevamo bisogno. Non sono rimasti più punti di interruzione, quindi l'applicazione si chiuderà normalmente dopo aver stampato l'ultima riga di testo.
(gdb) continue Continuing. Variable values modified [Inferior 1 (process 2330) exited normally] (gdb) q
Abbiamo ottenuto i valori delle variabili segrete e abbiamo testato il nostro
gdb
è utile quanto dovrebbe essere.