[Powered by Google Translate] GDB, il Progetto GNU Debugger, è un potente strumento di debug per C, insieme a molte altre lingue. Esso consente di curiosare dentro i vostri programmi in C, mentre sono in esecuzione, e ti dà anche la possibilità di vedere esattamente ciò che accade quando il vostro programma va in crash. E 'piuttosto carino, no? GDB è software libero, e funziona su molti popolari UNIX e Basati su Windows sistemi operativi, quindi è uno strumento molto diffuso. Dovreste imparare ad amarla. GDB professionisti hanno un tempo molto più facile individuare gli errori rispetto a coloro che cavarsela con tentativi e quantità infinita di dichiarazioni stampa. GDB è uno strumento da riga di comando, il che significa che è possibile interagire con esso in un terminale emissione di comandi tramite la tastiera invece di pulsanti cliccando con il mouse. Per avviare GDB, è letteralmente appena gdb al prompt e premi invio. Vedrete alcune righe stampate sullo schermo che vi mostra la versione di GDB che si sta eseguendo, le informazioni sul copyright, e alla fine vedrete il prompt di GDB: (gdb). Questo permette di sapere che GDB è pronto per i comandi. A questo punto, la cosa più importante da sapere come fare è smettere. Fortunatamente, questo è abbastanza semplice. Il comando quit fa proprio questo. Come scorciatoia, si può semplicemente utilizzare q troppo. Divertente come avvio GDB e poi prontamente smettere è, Parliamo ora su come usare GDB per aiutare il debug di un programma. Per iniziare, ho un programma di qui a factorial.c che ottiene un int e tenta il calcolo del fattoriale. Nel caso in cui non avete visto fattoriali prima o non li ricordo, Il fattoriale del numero n è uguale al prodotto di n - (n - 1), (n - 2), e così via - fino a colpire 1. Pertanto, il fattoriale di 3 è 3 * 2 * 1, o 6, e il fattoriale di 4 è 4 * 3 * 2 * 1, o 24. Il fattoriale di zero è un caso strano, è 1, e fattoriali degli interi negativi non sono definiti. In ogni caso, qualcosa del mio programma fattoriale è funky. Quando lo eseguo, stampa i numeri strani che non hanno nulla a che fare con fattoriali. Quindi, possiamo usare GDB per aiutare a capire cosa sta succedendo. GDB opera su file eseguibili, che sono i file binari prodotti dal processo di compilazione. Cioè, non possiamo correre GDB sul nostro. Co. H file di codice sorgente come factorial.c. Vogliamo farlo funzionare solo su fattoriale invece. Se il programma di richiesta della riga di comando argomenti, questo è dove li avevamo specificato. In questo caso, fattoriale non richiede alcuna riga di comando argomenti, quindi basta digitare RUN o R in breve. Verrà avviata l'esecuzione del programma fattoriale. Quando il programma si ferma, vado a prendere il mio GDB richiedere indietro. Ok, proviamo la stessa cosa, fattoriale di 4. Va bene, vediamo che stiamo ottenendo lo stesso tipo di spazzatura qui a GDB. Ora che il programma è terminato, non possiamo entrare e accedere a qualsiasi suo stato, quindi avremo bisogno per iniziare in esecuzione di nuovo prima di poter vedere cosa sta succedendo. Tuttavia, abbiamo bisogno di un modo per fermarlo mentre è nel bel mezzo della sua corsa. Per fare questo, utilizziamo quello che è chiamato un punto di interruzione. I punti di interruzione dire GDB per mettere in pausa il programma in una particolare funzione o il codice sorgente di linea in modo da poter esaminare lo stato del programma, i valori delle variabili, lo stato di memoria e tale, in quel punto. Dal momento che non so davvero dove le cose stanno andando male, Voglio solo avviare il debug proprio all'inizio, proprio quando inizia la principale. Ci impostare un punto di interruzione all'inizio del principale utilizzando il comando break. Possiamo anche usare b per abbreviare pausa. Ora avviare il programma in esecuzione di nuovo. Qui siamo all'inizio del principale, proprio come GDB ci dice. La riga di codice che sta per eseguire, ma non ha ancora è la linea printf. Possiamo dire GDB per eseguire questa riga di codice e passare alla riga successiva con il comando successivo o n. Va bene, ora GDB ci dice che siamo sulla linea GetInt. So che sembra che la linea printf non è stato eseguito dal momento che non vedere "Inserire un intero positivo" stampa su schermo, ma ha effettivamente eseguito. Quello che stiamo vedendo è il sistema operativo sopprimere qualcosa per iscritto alla schermata fino a quando non ha assolutamente a che perché il debug con stampe a volte può sembrare inaffidabile. Comunque, andiamo di nuovo passare alla riga di codice successiva ed entrare in un int. Anche in questo caso, cerchiamo di tipo 4. Quindi questo sembra strano. Siamo sulla linea 12 secondo il GDB, ma la riga successiva che sta per eseguire è solo una parentesi graffa. Questo significa solo che siamo alla fine di un ciclo, il nostro do while, infatti, GDB e ci sta dicendo che la condizione di terminazione, vale a dire non meno di zero, eseguirà successivo. Se questo diventa sempre un po 'di confusione, siamo in grado di tirare su il codice sorgente in GDB con la lista o il comando l. Consente di stampare il codice sorgente che è incentrata sulla linea che siamo attualmente. Se digitiamo elenco o l nuovo, vedremo la prossima serie di linee di stampa. Possiamo fare questo fino a quando abbiamo raggiunto la fine del file. Per tornare al punto in cui eravamo, siamo in grado di fornire lista con un numero di riga, in questo caso, la linea 12. Comunque, andiamo avanti. Ora siamo sul loop 4. Facciamo in modo che la nostra variabile num contiene 4. Lo facciamo con la stampa, o p, comando. Quindi, GDB ci dice che num è davvero la memorizzazione 4, come ci aspettavamo. Il $ 1 che GDB stampa non è una variabile GDB speciale che è ora impostato per memorizzare il numero di 4 pure. È possibile ignorare questo per ora, ma queste variabili GDB vengono in super pratico nei casi più avanzati quando si vuole richiamare quello che hai fatto in passato. In ogni caso, andando avanti con la prossima, vediamo che iniziano a muoversi attraverso il ciclo for. Andiamo avanti da qui con n bit per bit. Piuttosto che digitare n ogni volta, si può anche solo premere invio. Quando si premere invio senza digitare nulla, GDB ripete semplicemente il comando precedente. Così ora abbiamo colpito la chiamata a printf. Sembra che abbiamo veramente vissuto il nostro ciclo for 4 volte, che è quello che vogliamo fare per moltiplicare per 1, 2, 3, e 4. Tutto sembra come se è il caso, tranne quando abbiamo raggiunto prossima volta abbiamo avuto questo numero enorme invece di 24. Se stampare il valore del fattoriale con p, vediamo che fattoriale ha questo numero enorme in esso. Qualcosa sta sicuramente andando male. A questo punto, però, siamo quasi alla fine del programma, ed è troppo tardi per risolvere qualcosa. Tuttavia, siamo in grado di riavviare il programma digitando r nuovo e poi y per confermare. Ora siamo tornati al nostro punto di interruzione all'inizio del principale. Noi sappiamo che tutto sembra andare bene con la lettura del n. in modo che possiamo andare avanti con n. In alternativa, è possibile impostare un nuovo punto di interruzione dopo il do while e saltare lì. Facciamolo. Sembra che la linea 14 arriva subito dopo il ciclo. Facciamo impostare un punto di interruzione. E 'buona norma specificare il nome del file in questo comando breakpoint dal GDB può confondersi se si lavora con file multipli. Per andare avanti di questo punto di interruzione, useremo il comando continue o c. Ok, qui siamo al ciclo for. Andiamo linea 1 più nel ciclo for, e poi inizieremo variabili di stampa per vedere cosa sta succedendo. Facciamo in modo che i è davvero 1, come previsto. Yup, che va tutto bene. Che dire se fattoriale? Whoa, che non va bene. Abbiamo un gran numero negativo qui. Com'è successo? Beh, se guardiamo indietro il codice, vediamo che non abbiamo mai inizializzato, quindi dobbiamo solo spazzatura in là. Questo sarà sicuramente buttare fuori il nostro calcolo. Fortunatamente, non dobbiamo lasciare GDB per risolvere questo problema. Possiamo inizializzare proprio qui e fissarla nel codice in seguito utilizzando il comando di stampa. Ci inizializzare a 1 in quanto i fattoriali di zero e 1 sono entrambi 1, e se lo inizializza a zero, allora saremmo sempre finire con zero come il nostro risultato. È possibile impostare qualsiasi variabile in questo modo, che è super comodo. Ora, continuiamo il nostro programma. Facciamo in modo che tutto è dove dovrebbe essere. Num deve essere di 4, dovrei essere 1, e fattoriale dovrebbe essere 1 troppo. Siamo in grado di abbreviare questo processo e stampare tutte le nostre variabili locali con la gente del posto di comando super-utili informazioni, che stampa tutte le nostre variabili locali in ambito. In ogni caso, sembra che tutto sia a posto. Facciamo un altro go-around del loop solo per assicurarsi. Ok, tutto sembra grande. Ora possiamo usare il comando continue per andare fino in fondo. Sweet! 4 fattoriale stampato 24 come previsto. Ora possiamo andare a risolvere questo problema nel nostro codice. Invece di uscire su GDB, useremo un'altra scheda terminale per fare questo. Tornando al nostro scheda GDB, ora abbiamo bisogno di ricompilare il nostro eseguibile. Una delle cose migliori di GDB è che non c'è bisogno di lasciare GDB per eseguire make. In modo che non continuare a colpire i punti di interruzione vecchi, cerchiamo di disattivarli con l', avete indovinato, disattivare il comando. Questo disabilita tutti i nostri punti di interruzione. Ora, siamo in grado di riavviare il programma con r e assicurarsi che tutto va bene. Sembra che tutto è a posto. Fattoriale di 4 stampe su 24, proprio come abbiamo pensato. GDB è uno degli strumenti più utili che hai ottenuto nella cassetta degli attrezzi. Ci sono cose che una tonnellata di più si può fare con GDB, molto più di quanto si può fare con stampe semplici. La prossima volta che il vostro programma non sta facendo quello che ti piace, provare a eseguire GDB di capire cosa sta succedendo all'interno. Con un po 'di pratica, sarete in grado di eseguire il drill down sul tuo bug in poco tempo. Il mio nome è Nate Hardison. Questo è CS50.