1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Va bene GDB. 3 00:00:06,830 --> 00:00:08,480 Di cosa si tratta esattamente? 4 00:00:08,480 --> 00:00:11,310 Così GDB, che sta per il Debugger GNU, 5 00:00:11,310 --> 00:00:15,040 è uno strumento davvero fantastico che possiamo utilizzare per aiutarci a eseguire il debug nostri programmi, 6 00:00:15,040 --> 00:00:18,210 o scoprire dove sono le cose che non va nei nostri programmi. 7 00:00:18,210 --> 00:00:22,590 GDB è incredibilmente potente, ma l'uscita e l'interazione con essa 8 00:00:22,590 --> 00:00:23,830 può essere un po 'criptico. 9 00:00:23,830 --> 00:00:28,210 Di solito è un tool a riga di comando, e si può buttare un sacco di messaggi a voi. 10 00:00:28,210 --> 00:00:31,144 E può un po 'difficile analizzare esattamente cosa sta succedendo. 11 00:00:31,144 --> 00:00:33,560 Passi per fortuna, abbiamo preso per risolvere questo problema per voi 12 00:00:33,560 --> 00:00:36,281 come si lavora attraverso CS50. 13 00:00:36,281 --> 00:00:39,030 Se non si utilizza la grafica debugger, che il mio collega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse ha parlato abbastanza un po 'su di un video che 15 00:00:41,570 --> 00:00:44,740 dovrebbe essere qui in questo momento, potrebbe essere necessario 16 00:00:44,740 --> 00:00:48,270 di utilizzare questi riga di comando strumenti per lavorare con GDB. 17 00:00:48,270 --> 00:00:51,250 Se stai lavorando nella CS50 IDE, non è necessario fare questo. 18 00:00:51,250 --> 00:00:53,550 Ma se non siete lavorando in CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 magari utilizzando una versione di CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 o impiega un altro Linux Sistema con GDB installato su di esso, 21 00:00:58,860 --> 00:01:00,980 potrebbe essere necessario utilizzare questi strumenti da riga di comando. 22 00:01:00,980 --> 00:01:02,860 >> E dal momento che si potrebbe hanno a che fare questo, è 23 00:01:02,860 --> 00:01:06,280 utile solo per capire come GDB funziona dalla riga di comando. 24 00:01:06,280 --> 00:01:09,650 Ma ancora una volta, se siete utilizzando l'IDE CS50, si 25 00:01:09,650 --> 00:01:15,400 può utilizzare il debugger grafico che è costruito nell'IDE. 26 00:01:15,400 --> 00:01:18,750 Quindi, per far funzionare le cose con GDB, per avviare il debug 27 00:01:18,750 --> 00:01:21,220 processo di una particolare il programma, tutto quello che dovete fare 28 00:01:21,220 --> 00:01:23,810 è di tipo GDB seguito dal nome del programma. 29 00:01:23,810 --> 00:01:28,620 Così, per esempio, se il programma è ciao, si digiterà GDB ciao. 30 00:01:28,620 --> 00:01:31,210 >> Quando lo fate, si sta andando per tirare su l'ambiente GDB. 31 00:01:31,210 --> 00:01:33,800 Il prompt cambierà, e invece di essere ciò che di solito 32 00:01:33,800 --> 00:01:35,841 è quando si digita le cose ai line-- comando ls, 33 00:01:35,841 --> 00:01:38,115 cd-- tutto il vostro tipico Comandi di Linux, il prompt 34 00:01:38,115 --> 00:01:42,200 cambierà in, probabilmente, qualcosa come parentesi GDB parentesi. 35 00:01:42,200 --> 00:01:46,630 Questo è il tuo nuovo prompt GDB, perché sei dentro l'ambiente GDB. 36 00:01:46,630 --> 00:01:49,830 Una volta all'interno di tale ambiente, ci sono due importanti comandi 37 00:01:49,830 --> 00:01:52,290 che probabilmente utilizza nel seguente ordine. 38 00:01:52,290 --> 00:01:55,200 >> Il primo è b, che è l'abbreviazione di pausa. 39 00:01:55,200 --> 00:01:58,690 E dopo aver digitato b, in genere digitare il nome di una funzione, 40 00:01:58,690 --> 00:02:01,040 o se vi capita di sapere intorno a che cosa il numero di riga 41 00:02:01,040 --> 00:02:04,100 il programma sta iniziando a comportarsi un po 'strano, 42 00:02:04,100 --> 00:02:06,370 è possibile digitare una linea numero di lì. 43 00:02:06,370 --> 00:02:09,660 Cosa b, o rottura, fa è che consente al programma 44 00:02:09,660 --> 00:02:13,270 per eseguire fino a un certo punto, cioè, il nome della funzione 45 00:02:13,270 --> 00:02:15,880 specificato o la linea numero specificato. 46 00:02:15,880 --> 00:02:18,590 >> E a quel punto, si blocca l'esecuzione. 47 00:02:18,590 --> 00:02:21,670 Questa è una cosa veramente buona, perché una volta che l'esecuzione è stato congelato, 48 00:02:21,670 --> 00:02:25,214 si può cominciare a molto lentamente passo attraverso il vostro programma. 49 00:02:25,214 --> 00:02:28,130 In genere, se si è stati in esecuzione i programmi, sono piuttosto breve. 50 00:02:28,130 --> 00:02:31,250 Di solito, si digita barra puntino qualunque il nome del programma è, premere Invio, 51 00:02:31,250 --> 00:02:33,470 e prima di poter lampeggiare, la vostra programma è già terminato. 52 00:02:33,470 --> 00:02:36,620 Non è davvero un sacco di tempo per provare e capire cosa sta andando male. 53 00:02:36,620 --> 00:02:40,920 Quindi davvero essere in grado di rallentare cose giù impostando un punto di rottura con b, 54 00:02:40,920 --> 00:02:43,040 e poi intervenendo. 55 00:02:43,040 --> 00:02:46,169 >> Poi, una volta che hai impostato la tua vacanza punto, è possibile eseguire il programma. 56 00:02:46,169 --> 00:02:47,960 E se avete qualunque argomenti della riga di comando, 57 00:02:47,960 --> 00:02:51,610 si specifica qui, non quando si digita GDB vostro nome del programma. 58 00:02:51,610 --> 00:02:55,980 Si specifica tutta la riga di comando argomenti prendendo r, o correre, 59 00:02:55,980 --> 00:03:00,270 e poi gli argomenti della riga di comando qualsiasi è necessario all'interno del vostro programma. 60 00:03:00,270 --> 00:03:03,510 Ci sono un certo numero di altri veramente comandi importanti e utili 61 00:03:03,510 --> 00:03:04,970 all'interno dell'ambiente PIL. 62 00:03:04,970 --> 00:03:07,540 Quindi lasciatemi rapidamente superare alcuni di essi. 63 00:03:07,540 --> 00:03:11,320 >> Il primo è n, che è l'abbreviazione per il prossimo, e si può digitare successiva invece di n, 64 00:03:11,320 --> 00:03:12,304 entrambi avrebbero funzionato. 65 00:03:12,304 --> 00:03:13,470 Ed è solo la stenografia. 66 00:03:13,470 --> 00:03:17,540 E come probabilmente avete già ottenuto utilizzato per, essere in grado di scrivere le cose 67 00:03:17,540 --> 00:03:20,520 più breve è generalmente migliore. 68 00:03:20,520 --> 00:03:24,100 E che cosa farà è che sarà avanzare di un blocco di codice. 69 00:03:24,100 --> 00:03:26,170 Così muoverà avanti fino a quando una chiamata di funzione. 70 00:03:26,170 --> 00:03:28,350 E allora invece di tuffarsi in quella funzione 71 00:03:28,350 --> 00:03:33,130 e passando attraverso tutti che le funzioni codice, sarà solo avere la funzione. 72 00:03:33,130 --> 00:03:34,400 >> La funzione verrà chiamata. 73 00:03:34,400 --> 00:03:35,733 Si farà tutto ciò che il suo lavoro è. 74 00:03:35,733 --> 00:03:38,870 Si restituirà un valore di la funzione che lo ha chiamato. 75 00:03:38,870 --> 00:03:42,490 E allora ti passa al riga successiva di tale funzione chiamante. 76 00:03:42,490 --> 00:03:44,555 Se si vuole fare un passo all'interno della funzione, 77 00:03:44,555 --> 00:03:46,430 invece di avere esso esegue, soprattutto 78 00:03:46,430 --> 00:03:50,004 se si pensa che il problema potrebbe trovarsi all'interno di quella funzione, 79 00:03:50,004 --> 00:03:52,670 si potrebbe, naturalmente, impostare una pausa punto all'interno di tale funzione. 80 00:03:52,670 --> 00:03:57,820 Oppure, se siete già in esecuzione, è possibile usare s fare un passo in avanti di una riga di codice. 81 00:03:57,820 --> 00:04:01,170 >> Quindi questo sarà un passo dentro e tuffarsi in funzioni, 82 00:04:01,170 --> 00:04:04,750 invece di avere solo la execute e continuando nella funzione 83 00:04:04,750 --> 00:04:07,380 che ci si trova per il debug. 84 00:04:07,380 --> 00:04:09,870 Se mai voglia di sapere il valore di una variabile, 85 00:04:09,870 --> 00:04:12,507 è possibile digitare p, o Stampa, e poi il nome della variabile. 86 00:04:12,507 --> 00:04:15,090 E che stamperanno a voi, all'interno dell'ambiente GDB, 87 00:04:15,090 --> 00:04:19,110 il nome della variabile, che you-- scusate me-- il valore della variabile 88 00:04:19,110 --> 00:04:20,064 che hai chiamato. 89 00:04:20,064 --> 00:04:23,230 Se volete conoscere i valori di ogni variabile locale accessibile da dove 90 00:04:23,230 --> 00:04:25,970 vi trovate nella vostra il programma, è possibile digitare informazioni locali. 91 00:04:25,970 --> 00:04:28,332 E 'molto più veloce di digitando p e poi tutto ciò che, 92 00:04:28,332 --> 00:04:30,540 elencando tutti i variabili che si conosce l'esistenza. 93 00:04:30,540 --> 00:04:34,370 È possibile digitare informazioni locali, ed è stamperà fuori tutto per voi. 94 00:04:34,370 --> 00:04:37,770 Il prossimo è bt, che è abbreviazione di Torna Trace. 95 00:04:37,770 --> 00:04:41,680 Ora, in generale, soprattutto all'inizio del CS50, 96 00:04:41,680 --> 00:04:44,450 non sarà davvero avere occasione utilizzare bt, o Indietro Trace, 97 00:04:44,450 --> 00:04:47,860 perché non stai con funzioni che chiamano altre funzioni. 98 00:04:47,860 --> 00:04:50,450 >> Si potrebbe avere una chiamata principale la funzione, ma questo è probabilmente. 99 00:04:50,450 --> 00:04:53,199 Non è necessario che altre funzioni chiamare un'altra funzione, che 100 00:04:53,199 --> 00:04:54,880 chiama un'altra funzione, e così via. 101 00:04:54,880 --> 00:04:57,550 Ma, come i programmi si fanno più complesso, e in particolare 102 00:04:57,550 --> 00:05:00,290 quando si inizia a lavorare con la ricorsione, tracce indietro 103 00:05:00,290 --> 00:05:05,150 può essere un modo molto utile per farti tipo di ottenere un contesto per cui 104 00:05:05,150 --> 00:05:06,460 Io sono nel mio programma. 105 00:05:06,460 --> 00:05:10,590 Quindi dici che hai scritto il tuo codice, e si sa che principale chiama una funzione 106 00:05:10,590 --> 00:05:14,720 f, che chiama una funzione g, che chiama una funzione h. 107 00:05:14,720 --> 00:05:17,650 Così abbiamo diversi strati di nidificazione succedendo qui. 108 00:05:17,650 --> 00:05:19,440 >> Se sei dentro di l'ambiente di GDB, 109 00:05:19,440 --> 00:05:21,640 e sai che il tuo interno di ore, ma si dimentica 110 00:05:21,640 --> 00:05:27,210 su ciò che hai da dove are-- è possibile digitare bt, o traccia indietro, 111 00:05:27,210 --> 00:05:32,370 e stamperà h, g, f principale, insieme ad altre informazioni, quali 112 00:05:32,370 --> 00:05:35,984 ti dà un indizio che, principale OK chiamato f, f chiamata g, g chiamato h, 113 00:05:35,984 --> 00:05:37,900 ed è lì che ho attualmente sono nel mio programma. 114 00:05:37,900 --> 00:05:41,380 Così può essere davvero utile, tanto più che il criptico-ness di GDB 115 00:05:41,380 --> 00:05:45,667 diventa un po 'opprimente, a scoprire esattamente dove stanno le cose. 116 00:05:45,667 --> 00:05:48,500 Infine, quando il programma è fatto, o quando hai finito il debug 117 00:05:48,500 --> 00:05:50,125 e si desidera allontanarsi dall'ambiente GDB, 118 00:05:50,125 --> 00:05:51,940 è utile sapere come uscirne. 119 00:05:51,940 --> 00:05:55,500 È possibile digitare q, o Esci, per uscire. 120 00:05:55,500 --> 00:05:59,220 Ora, prima di video di oggi Ho preparato un programma buggy 121 00:05:59,220 --> 00:06:03,900 chiamato buggy1, che ho compilato da un file noto come buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Come ci si potrebbe aspettare, questo programma è infatti buggy. 123 00:06:06,500 --> 00:06:08,990 Qualcosa va storto quando provo ed eseguirlo. 124 00:06:08,990 --> 00:06:13,014 Ora, purtroppo, ho inavvertitamente cancellato il mio file buggy1.c, 125 00:06:13,014 --> 00:06:15,930 così in modo per me per capire cosa sta andando male con questo programma, 126 00:06:15,930 --> 00:06:18,770 Ho intenzione di dover utilizzare GDB sorta di cieca, cercando di 127 00:06:18,770 --> 00:06:22,372 per navigare attraverso questo programma per capire esattamente cosa sta andando male. 128 00:06:22,372 --> 00:06:24,580 Ma utilizzando solo gli strumenti abbiamo già imparato a conoscere, 129 00:06:24,580 --> 00:06:27,700 si può tranquillamente figura esattamente quello che è. 130 00:06:27,700 --> 00:06:30,740 Quindi cerchiamo di testa verso CS50 IDE e dare un'occhiata. 131 00:06:30,740 --> 00:06:33,155 Ok, siamo qui nella mia CS50 ambiente IDE, 132 00:06:33,155 --> 00:06:35,697 e io lo zoom in un po ' così si può vedere un po 'di più. 133 00:06:35,697 --> 00:06:38,530 Nella mia finestra di terminale, se vi elenco il contenuto del mio attuale direttore 134 00:06:38,530 --> 00:06:41,250 con ls, vedremo che io avere un paio di file di origine 135 00:06:41,250 --> 00:06:44,982 qui, tra cui il precedentemente discusso buggy1. 136 00:06:44,982 --> 00:06:46,940 Che cosa accade esattamente quando Provo e corro buggy1. 137 00:06:46,940 --> 00:06:47,773 Beh diciamo scoprirlo. 138 00:06:47,773 --> 00:06:52,510 Digito barra puntino, buggy, e mi ha colpito Invio. 139 00:06:52,510 --> 00:06:53,670 >> Errori di segmentazione. 140 00:06:53,670 --> 00:06:55,000 Questo non va bene. 141 00:06:55,000 --> 00:06:57,180 Se vi ricordate, un segmentation fault tipicamente 142 00:06:57,180 --> 00:07:01,540 si verifica quando si accede memoria che non ci è permesso di toccare. 143 00:07:01,540 --> 00:07:03,820 Abbiamo in qualche modo raggiunto al di fuori dei limiti 144 00:07:03,820 --> 00:07:05,995 di ciò che il programma, la compilatore, ci ha dato. 145 00:07:05,995 --> 00:07:08,310 E così già questo è un indizio per mantenere nella casella degli strumenti 146 00:07:08,310 --> 00:07:10,660 mentre iniziamo il processo di debug. 147 00:07:10,660 --> 00:07:13,620 Qualcosa è andato un po 'sbagliato qui. 148 00:07:13,620 --> 00:07:15,935 >> Va bene, quindi cerchiamo di partenza l'ambiente GDB 149 00:07:15,935 --> 00:07:19,030 e vedere se siamo in grado di capire che cosa è esattamente il problema. 150 00:07:19,030 --> 00:07:21,674 Ho intenzione di cancellare il mio schermo, e ho intenzione di scrivere GDB 151 00:07:21,674 --> 00:07:24,340 ancora una volta, per accedere all'ambiente GDB, e il nome del programma 152 00:07:24,340 --> 00:07:27,450 che voglio eseguire il debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Abbiamo un piccolo messaggio, la lettura simboli buggy1, fatto. 154 00:07:30,182 --> 00:07:32,390 Tutto questo significa è tirato insieme tutto il codice, 155 00:07:32,390 --> 00:07:35,570 e ora è stato caricato in GDB, ed è pronto a partire. 156 00:07:35,570 --> 00:07:37,140 >> Ora, che cosa voglio fare? 157 00:07:37,140 --> 00:07:39,130 Ti ricordi quello che il primo passo è tipicamente 158 00:07:39,130 --> 00:07:42,540 dopo che sono dentro di questo ambiente? 159 00:07:42,540 --> 00:07:44,540 Speriamo che detto insieme un punto di rottura, perché 160 00:07:44,540 --> 00:07:46,240 infatti questo è ciò che voglio fare. 161 00:07:46,240 --> 00:07:47,990 Ora, io non ho il codice sorgente di questo 162 00:07:47,990 --> 00:07:50,948 di fronte a me, che è probabilmente Non il tipico caso d'uso, tra l'altro. 163 00:07:50,948 --> 00:07:52,055 Probabilmente lo farà. 164 00:07:52,055 --> 00:07:52,680 Quindi, questo è un bene. 165 00:07:52,680 --> 00:07:55,790 Ma a patto che non, che cosa è la una funzione che si sa 166 00:07:55,790 --> 00:07:58,880 esiste in ogni singolo programma C? 167 00:07:58,880 --> 00:08:04,420 Non importa quanto grande o complicato è, questa funzione sicuramente esiste. 168 00:08:04,420 --> 00:08:05,440 Main, giusto? 169 00:08:05,440 --> 00:08:08,870 >> Quindi in mancanza di ogni altra cosa, ci si può impostare un punto di interruzione a principale. 170 00:08:08,870 --> 00:08:12,200 E ancora, ho potuto solo digitare rompere principale, invece di b. 171 00:08:12,200 --> 00:08:14,650 E se siete curiosi, se mai digitare un comando lungo 172 00:08:14,650 --> 00:08:16,800 e poi rendersi conto che si digitato la cosa sbagliata, 173 00:08:16,800 --> 00:08:18,770 e si vuole sbarazzarsi di tutto quanto ho appena fatto, 174 00:08:18,770 --> 00:08:22,029 si può prendere il controllo di U, che sarà cancellare tutto e vi riporterà 175 00:08:22,029 --> 00:08:23,570 all'inizio delle linee del cursore. 176 00:08:23,570 --> 00:08:26,569 Molto più veloce di appena tenere premuto il eliminare o colpendola volte e mazzo 177 00:08:26,569 --> 00:08:27,080 sopra. 178 00:08:27,080 --> 00:08:28,740 >> Quindi verrà impostato un punto di interruzione a principale. 179 00:08:28,740 --> 00:08:32,970 E come si può vedere, si dice che abbiamo impostare un punto di interruzione a file di buggy1.c, 180 00:08:32,970 --> 00:08:36,330 ea quanto pare la prima linea di codice di principale è la linea di sette. 181 00:08:36,330 --> 00:08:38,080 Ancora una volta, non abbiamo il file di origine qui, 182 00:08:38,080 --> 00:08:40,429 ma darò per scontato che si tratta di dirmi la verità. 183 00:08:40,429 --> 00:08:44,510 E poi, io sto solo cercando ed eseguire il programma, r. 184 00:08:44,510 --> 00:08:45,360 L'avvio del programma. 185 00:08:45,360 --> 00:08:48,160 Va bene, quindi questo messaggio è un po 'criptico. 186 00:08:48,160 --> 00:08:50,160 Ma in fondo che cosa è accadendo qui è che è solo 187 00:08:50,160 --> 00:08:53,350 mi dice ho colpito la mia pausa punto, rottura punto numero 1. 188 00:08:53,350 --> 00:08:55,877 >> E poi, quella riga di codice, Nessun file o directory con questo nome. 189 00:08:55,877 --> 00:08:57,710 L'unica ragione per cui Sto vedendo che il messaggio 190 00:08:57,710 --> 00:09:00,800 è perché ho inavvertitamente cancellato il mio file buggy.c. 191 00:09:00,800 --> 00:09:04,050 Se il mio file di buggy1.c esistito nella directory corrente, 192 00:09:04,050 --> 00:09:06,920 che proprio la linea ci sarebbe in realtà dimmi che cosa la riga di codice 193 00:09:06,920 --> 00:09:08,214 si legge letteralmente. 194 00:09:08,214 --> 00:09:09,380 Purtroppo, ho cancellato. 195 00:09:09,380 --> 00:09:14,790 Stiamo andando ad avere per tipo di navigazione attraverso questo un po 'più cieca. 196 00:09:14,790 --> 00:09:17,330 >> Ok, vediamo, cosa voglio fare qui? 197 00:09:17,330 --> 00:09:21,770 Beh, mi piacerebbe sapere che cosa locali variabili forse sono disponibili per me. 198 00:09:21,770 --> 00:09:23,570 Ho iniziato il mio programma. 199 00:09:23,570 --> 00:09:28,515 Vediamo cosa potrebbe essere già inizializzato per noi. 200 00:09:28,515 --> 00:09:31,430 I tipo Info gente del posto, nessuna locali. 201 00:09:31,430 --> 00:09:33,960 Va bene, in modo che non lo fa dammi una tonnellata di informazioni. 202 00:09:33,960 --> 00:09:37,600 Potrei provare e stampare una variabile, ma io non conosco i nomi delle variabili. 203 00:09:37,600 --> 00:09:39,930 Potrei provare una traccia indietro, ma io sono dentro di principale, 204 00:09:39,930 --> 00:09:43,710 quindi so che non ho fatto un'altra chiamata di funzione al momento. 205 00:09:43,710 --> 00:09:47,710 >> Così sembra che le mie uniche opzioni sono a utilizzare n o giù di lì e iniziare a tuffarsi. 206 00:09:47,710 --> 00:09:49,630 Ho intenzione di utilizzare n. 207 00:09:49,630 --> 00:09:51,180 Così ho tipo n. 208 00:09:51,180 --> 00:09:53,060 Oh mio Dio, che cosa sta succedendo qui. 209 00:09:53,060 --> 00:09:56,260 Programma ha ricevuto segnali, SIGSEGV segmentation fault, 210 00:09:56,260 --> 00:09:57,880 e poi un sacco di roba. 211 00:09:57,880 --> 00:09:58,880 Sono già sopraffatto. 212 00:09:58,880 --> 00:10:00,980 Beh, c'è in realtà un molto da imparare qui. 213 00:10:00,980 --> 00:10:02,520 Che cosa ci dice questo? 214 00:10:02,520 --> 00:10:09,180 Quello che ci dice è, questo programma è per farlo, ma non ha ancora, colpa seg. 215 00:10:09,180 --> 00:10:12,550 E in particolare, sto andando per ingrandire ancora di più qui, 216 00:10:12,550 --> 00:10:18,980 è in procinto di Seg colpa su qualcosa chiamato strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Ora, potremmo non abbiamo discusso questa funzione estesamente. 218 00:10:22,705 --> 00:10:25,580 Ma è-- perché non stiamo andando per parlare di ogni funzione che 219 00:10:25,580 --> 00:10:28,610 esiste nello standard C library-- ma sono tutti a vostra disposizione, 220 00:10:28,610 --> 00:10:32,110 soprattutto se si prende un guardare reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 E strcmp è davvero potente funzione che esiste dentro 222 00:10:35,000 --> 00:10:38,070 dell'intestazione string.h file, che è un'intestazione 223 00:10:38,070 --> 00:10:41,970 File che è dedicato alle funzioni che lavorano con e manipolare le stringhe. 224 00:10:41,970 --> 00:10:49,830 >> E in particolare, ciò che fa è strcmp confronta i valori di due stringhe. 225 00:10:49,830 --> 00:10:54,160 Quindi sono sul punto di segmentazione guasto su una chiamata a strcmp sembra. 226 00:10:54,160 --> 00:10:58,530 Mi ha colpito n, e infatti ottengo il messaggio, programma terminato con il segnale SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentation fault. Così ora Io in realtà ho seg guasto, 228 00:11:01,370 --> 00:11:06,479 e il mio programma ha abbastanza molto efficace rinunciato. 229 00:11:06,479 --> 00:11:07,770 Questa è la fine del programma. 230 00:11:07,770 --> 00:11:10,370 Si è rotto, si è schiantato. 231 00:11:10,370 --> 00:11:14,740 Quindi non era molto, ma io in realtà ha fatto imparare un po ' 232 00:11:14,740 --> 00:11:16,747 da questa piccola esperienza. 233 00:11:16,747 --> 00:11:17,580 Che cosa ho imparato? 234 00:11:17,580 --> 00:11:22,020 Beh, il mio programma si blocca praticamente subito. 235 00:11:22,020 --> 00:11:26,300 Il mio programma va in crash una chiamata a strcmp, ma io 236 00:11:26,300 --> 00:11:30,560 non hanno alcun variabili locali nel mio il programma nel momento in cui si blocca. 237 00:11:30,560 --> 00:11:37,320 Così che cosa stringa o stringhe, potrei essere il confronto. 238 00:11:37,320 --> 00:11:42,140 Se non ho alcun locale variabili, si potrebbe 239 00:11:42,140 --> 00:11:45,520 Suppongo che ci have-- forse è un variabile globale, che potrebbe essere vero. 240 00:11:45,520 --> 00:11:47,670 >> Ma in generale, sembra come sto paragonando 241 00:11:47,670 --> 00:11:52,070 a qualcosa che non esiste. 242 00:11:52,070 --> 00:11:54,130 Quindi cerchiamo di indagare che un po 'oltre. 243 00:11:54,130 --> 00:11:55,120 Quindi ho intenzione di cancellare il mio schermo. 244 00:11:55,120 --> 00:11:57,536 Ho intenzione di uscire fuori dalla Ambiente GDB per un secondo. 245 00:11:57,536 --> 00:12:01,300 E sto pensando, OK, quindi non c'è senza variabili locali nel mio programma. 246 00:12:01,300 --> 00:12:06,444 Mi chiedo se forse dovrei passare in una stringa come argomento della riga di comando. 247 00:12:06,444 --> 00:12:07,610 Così facciamo solo testare il tutto. 248 00:12:07,610 --> 00:12:09,020 Io non ho fatto prima. 249 00:12:09,020 --> 00:12:14,244 >> Vediamo se forse se corro questo programma con un argomento da riga di comando che funziona. 250 00:12:14,244 --> 00:12:16,140 Eh, no segmentation fault lì. 251 00:12:16,140 --> 00:12:17,870 E 'appena mi ha detto che ho capito. 252 00:12:17,870 --> 00:12:19,170 Quindi forse è la correzione qui. 253 00:12:19,170 --> 00:12:27,560 E in effetti, se vado indietro e guardare il codice sorgente per buggy1.c, 254 00:12:27,560 --> 00:12:31,180 sembra che quello che sto facendo è Sto facendo una chiamata a strcmp senza 255 00:12:31,180 --> 00:12:34,010 verificare se infatti argv [1] esiste. 256 00:12:34,010 --> 00:12:36,730 Questo è in realtà la codice sorgente per buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Che cosa ho veramente bisogno di fare qui per fissare il mio programma, 258 00:12:38,855 --> 00:12:40,835 supponendo che ho la presentare di fronte a me, è 259 00:12:40,835 --> 00:12:44,740 per aggiungere solo un controllo per fare Assicurarsi che argc è pari a 2. 260 00:12:44,740 --> 00:12:47,780 Quindi questo esempio, ancora una volta, come ho detto, è un pò forzato, giusto? 261 00:12:47,780 --> 00:12:49,840 Non stai in genere andando a eliminare accidentalmente il codice sorgente 262 00:12:49,840 --> 00:12:51,820 e poi a provare e testare il programma. 263 00:12:51,820 --> 00:12:53,120 Ma si spera, ha dato si un'illustrazione 264 00:12:53,120 --> 00:12:55,120 dei tipi di cose che si potrebbe pensare di 265 00:12:55,120 --> 00:12:56,610 come si sta debugging del programma. 266 00:12:56,610 --> 00:12:58,760 >> Qual è lo stato delle cose qui? 267 00:12:58,760 --> 00:13:00,510 Quali sono le variabili che fare avere accesso a me? 268 00:13:00,510 --> 00:13:03,600 Dove esattamente è il mio programma schiantarsi, su quale linea, 269 00:13:03,600 --> 00:13:05,240 su cosa chiamata alla quale funzione? 270 00:13:05,240 --> 00:13:06,952 Che tipo di indizi fa che mi danno? 271 00:13:06,952 --> 00:13:08,910 E questo è esattamente il tipo di mentalità che si 272 00:13:08,910 --> 00:13:12,820 dovrebbe essere sempre in quando sei pensando di debug dei programmi. 273 00:13:12,820 --> 00:13:13,820 >> Sono Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Questo è CS50. 275 00:13:16,140 --> 00:15:08,642