GDB Tutorial
Iniziare con GDB
Ricerca…
Osservazioni
GDB (GNU Project debugger) è un debugger di base della riga di comando che è in grado di analizzare programmi in esecuzione e animati. Secondo il manuale dell'utente GDB supporta C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, Pascal, Rust, assembly, Modula-2 e Ada.
GDB ha le stesse funzionalità della maggior parte dei debugger ma è diverso dalla maggior parte di quelli che ho usato, tutto basato sui comandi di battitura invece di fare clic sugli elementi della GUI. Alcune di queste funzionalità includono:
- Impostazione dei punti di interruzione
- Stampa del valore delle variabili.
- Impostazione del valore delle variabili per testare le cose.
- Visualizzazione dello stack
Cos'è GDB?
GDB, abbreviazione di GNU Debugger, è il debugger più popolare per i sistemi UNIX per il debug di programmi C e C ++. GNU Debugger, che è anche chiamato gdb, è il debugger più popolare per i sistemi UNIX per il debug di programmi C e C ++.
GNU Debugger ti aiuta a ottenere informazioni su quanto segue:
Se si è verificato un core dump, quale dichiarazione o espressione ha fatto crashare il programma?
Se si verifica un errore durante l'esecuzione di una funzione, quale riga del file
il programma contiene la chiamata a quella funzione, e quali sono i
parametri?Quali sono i valori delle variabili del programma in un punto particolare durante l'esecuzione del programma?
Qual è il risultato di una particolare espressione in un programma?
Avvio di GDB
Per avviare GDB, nel terminale,
gdb <executable name>
Per l'esempio precedente con un programma chiamato main, il comando diventa
gdb main
Impostazione dei punti di interruzione
Probabilmente vorrai che il tuo programma si fermi ad un certo punto in modo che tu possa rivedere le condizioni del tuo programma. La linea alla quale vuoi che il programma si fermi temporaneamente viene chiamata breakpoint.
break <source code line number>
Esecuzione del programma
Per eseguire il tuo programma, il comando è, come hai intuito,
run
Aprire un nucleo
gdb -c coreFile pathToExecutable
Lavorare con un file principale
Ha creato questo programma davvero brutto
#include <stdio.h>
#include <ctype.h>
// forward declarations
void bad_function()
{
int *test = 5;
free(test);
}
int main(int argc, char *argv[])
{
bad_function();
return 0;
}
gcc -g ex1.c
./a.out //or whatever gcc creates
Segmentation fault (core dumped)
gdb -c core a.out
Core was generated by `./a.out'.
Programma terminato con segnale SIGSEGV, errore di segmentazione. # 0 __GI___libc_free (mem = 0x5) in malloc.c: 2929 2929 malloc.c: Nessun file o directory di questo tipo.
(gdb) where
# 0 __GI___libc_free (mem = 0x5) in malloc.c: 2929 # 1 0x0000000000400549 in bad_function () in ex1.c: 12 # 2 0x0000000000400564 in main (argc = 1, argv = 0x7fffb825bd68) in ex1.c: 19
Dal momento che ho compilato con -g puoi vedere che chiamare dove dice che non mi piace il codice sulla riga 12 di bad_function ()
Quindi posso esaminare la variabile di prova che ho provato a liberare
(gdb) up
# 1 0x0000000000400549 in bad_function () in ex1.c: 12 12 gratuito (test);
(gdb) print test
$ 1 = (int *) 0x5
(gdb) print *test
Impossibile accedere alla memoria all'indirizzo 0x5
In questo caso il bug è abbastanza ovvio che ho provato a liberare un puntatore a cui è stato appena assegnato l'indirizzo 5 che non è stato creato da malloc così libero da non avere idea di cosa farsene.