![Come cambiare il nome utente di Snapchat senza creare un nuovo account](/f/babf6aaf240e57499eb7164ecf3a68ad.png?width=100&height=100)
Un debugger svolge un ruolo fondamentale in qualsiasi sistema di sviluppo software. Nessuno può scrivere un codice senza errori tutto in una volta. Nel corso dello sviluppo, vengono segnalati bug e devono essere risolti per ulteriori miglioramenti. Un sistema di sviluppo è incompleto senza un debugger. Considerando la comunità di sviluppatori open source, GNU Debugger è la scelta migliore. Viene anche utilizzato per lo sviluppo di software commerciale su piattaforme di tipo UNIX.
GNU Debugger, conosciuto anche come gdb, ci consente di intrufolarci nel codice durante l'esecuzione o in ciò che un programma stava cercando di fare nel momento prima del crash. GDB fondamentalmente ci aiuta a fare quattro cose principali per catturare i difetti nel codice sorgente.
Possiamo usare gdb per eseguire il debug di programmi scritti in C e C++ senza troppi sforzi. A partire da ora supporto per altri linguaggi di programmazione come D, Modulo-2, Fortran sono parziali.
GDB viene invocato usando il gdb comando. All'emissione gdb, mostra alcune informazioni sulla piattaforma e ti porta nel (gdb) come mostrato di seguito.
[[e-mail protetta] ~]# gdb
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 Copyright (C) 2013 Free Software Foundation, Inc. Licenza GPLv3+: GNU GPL versione 3 o successiva Questo è un software gratuito: sei libero di modificarlo e ridistribuirlo. NESSUNA GARANZIA, nella misura consentita dalla legge. Digita "mostra copia" e "mostra garanzia" per i dettagli. Questo GDB è stato configurato come "x86_64-redhat-linux-gnu". Digita "mostra configurazione" per i dettagli di configurazione. Per istruzioni sulla segnalazione di bug, vedere:. Trova il manuale GDB e altre risorse di documentazione online all'indirizzo:. Per aiuto, digita "aiuto". Digita "apropos word" per cercare i comandi relativi a "word". (gdb)
Tipo aiuto elencare le diverse classi di comandi disponibili all'interno di gdb. Tipo aiutoseguito da un nome di classe per un elenco di comandi in quella classe. Tipo aiuta tutti per l'elenco di tutti i comandi. Le abbreviazioni dei nomi dei comandi sono consentite se non sono ambigue. Ad esempio, puoi digitare n invece di digitare prossimo o C per Continua e così via.
Usato comunemente comandi gdb sono elencati nella tabella seguente. Questi comandi devono essere usati dal prompt dei comandi gdb (gdb).
Comando |
Descrizione |
correre |
Avvia l'esecuzione di un programma |
esentato |
Esci da gdb |
stampa espr |
Stampa espressione dove espr potrebbe essere anche un nome di variabile |
prossimo |
Vai alla riga successiva |
fare un passo |
Passa alla riga successiva |
Continua |
Continua dalla riga corrente fino alla fine del programma o al prossimo punto di interruzione |
Nota la differenza tra i due comandi fare un passo e prossimo. Il prossimo il comando non entra nella funzione se la riga successiva è una chiamata di funzione. Mentre fare un passo il comando può entrare nella funzione e vedere cosa succede lì.
Considera il seguente codice sorgente.
// somma.c. #includereint somma (int a, int b) { int c; c = a + b; ritorno c; } int main() { int x, y, z; printf("\nInserisci il primo numero: "); scanf("%d", &x); printf("Inserisci il secondo numero: "); scanf("%d", &y); z = somma (x, y); printf("La somma è %d\n\n", z); restituisce 0; }
Per eseguire il debug del file di output dobbiamo compilare lo stesso con -G opzione per gcc come segue.
$ gcc -g somma.c -o somma
Il file di output somma può essere collegato a gdb tramite uno dei seguenti 2 modi:
1. Specificando il file di output come argomento per gdb.
$ gdb somma
2. Esecuzione del file di output all'interno di gdb utilizzando file comando.
$ gdb. (gdb) somma file
Il elenco comando elenca le righe nel file del codice sorgente e sposta il puntatore. Quindi prima elencovisualizzerà le prime 10 righe e le successive elenco visualizza i successivi 10 e così via.
(gdb) elenco. 1 #include2 3 int somma (int a, int b) { 4 int c; 5c = a + b; 6 ritorno c; 7 } 8 9 int main() { 10 int x, y, z;
Per avviare l'esecuzione, emettere il correrecomando. Ora il programma viene eseguito normalmente. Ma abbiamo dimenticato di inserire alcuni punti di interruzione nel codice sorgente per il debug, giusto? Questi punti di interruzione possono essere specificati per funzioni o su righe specificate.
(gdb) si principale
Nota: ho usato un'abbreviazione B per rompere.
Dopo aver impostato il punto di interruzione nella funzione principale, la ripetizione del programma si fermerà alla riga 11. La stessa cosa può essere applicata se il numero di riga è noto prima.
(gdb) b sum.c: 11
Ora passa attraverso le righe di codice usando il prossimoo n comando. È importante notare che prossimo Il comando non entra nel codice della funzione a meno che non sia impostato un punto di interruzione sulla funzione. Proviamo il Stampa comanda ora. Impostare il punto di interruzione sulla somma delle funzioni come di seguito.
(gdb) b sum Punto di interruzione 1 in 0x4005aa: file sum.c, riga 5. (gdb) r Programma iniziale: /root/sum Digitare il primo numero: 2 Digitare il secondo numero: 3 Breakpoint 1, somma (a=2, b=3) a sum.c: 5 5 c = a + b; (gdb) p a $1 = 2 (gdb) p b $2 = 3. (gdb) c Continuando. La somma è 5 [Inferiore 1 (processo 3444) è uscito normalmente]
Se il programma in esecuzione richiede parametri della riga di comando, fornire lo stesso insieme al correre comando come.
(gdb) correre.. .
I file della libreria condivisa associati al programma in esecuzione possono essere elencati come.
(gdb) info share Da A Syms Read Shared Object Library 0x00000035a6000b10 0x00000035a6019c70 Sì /lib64/ld-linux-x86-64.so.2 0x00000035a641f560 0x00000035a6560bb4 Sì /lib64/libc.so.6
GDB è anche in grado di modificare le variabili durante l'esecuzione del programma. Proviamo questo. Come accennato in precedenza, imposta il punto di interruzione alla riga 16 ed esegui il programma.
(gdb) r Programma iniziale: /root/sum Immettere il primo numero: 1 Immettere il secondo numero: 2 Breakpoint 1, main ( ) at sum.c: 16 16 printf("La somma è %d\n\n", z); (gdb) imposta z=4 (gdb) c Continuando. La somma è 4
Ora a = 1, b = 2 e il risultato dovrebbe essere z = 3. Ma qui abbiamo cambiato il risultato finale in z = 4 nella funzione principale. In questo modo il debug può essere semplificato utilizzando gdb.
Per ottenere l'elenco di tutti i tipi di breakpoint punti di interruzione delle informazioni.
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005c2 in main at sum.c: 11
Qui c'è solo un punto di rottura ed è A. abilitato disabilita i punti di interruzione specificare il numero del punto di interruzione insieme a disattivare comando. Per abilitare in seguito utilizzare il abilitare comando.
(gdb) disabilita 1 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint mantieni n 0x00000000004005c2 in main at sum.c: 11
Puoi anche eliminare i punti di interruzione con Elimina comando.
Numerosi processi sono in esecuzione in background in un sistema GNU/Linux. Per eseguire il debug di un processo in esecuzione prima di tutto dobbiamo trovare l'id del processo di quel particolare processo. pidofcomando ti dà il pid di un processo.
$ pidof
Ora dobbiamo allegare questo pid a gdb. Ci sono 2 modi.
1. Specificando pid insieme a gdb.
$ gdb -p
2. Usando allegare comando da gdb.
(gdb) allega
È tutto per ora. Queste sono solo le basi di gdb per iniziare bene il debug del codice sorgente ed è molto più delle cose spiegate sopra. Ad esempio, possiamo eseguire il debug utilizzando le informazioni sullo stack, le variabili di ambiente e molto altro. Prova a giocare con tutte queste cose...