GDBIniziare con GDB


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

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  
 

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?

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.