1 00:00:00,000 --> 00:00:00,309 2 00:00:00,309 --> 00:00:02,350 [? DAN ARMADARAS:?] Bună, Im [? Dan Armadaras?]. 3 00:00:02,350 --> 00:00:04,410 Astăzi, vom fi uitat la depanare. 4 00:00:04,410 --> 00:00:06,697 Nu numai vom vorbesc despre unele tehnici, 5 00:00:06,697 --> 00:00:09,280 dar, de asemenea, ne vom uita la unele dintre caracteristicile conținute 6 00:00:09,280 --> 00:00:14,170 în cadrul IDE CS50 care permit te pentru a depana cu ușurință un program. 7 00:00:14,170 --> 00:00:16,272 >> Doar un exemplu de ceva care poate merge prost 8 00:00:16,272 --> 00:00:18,730 și este de fapt ceva pe care le-am văzut deja înainte. 9 00:00:18,730 --> 00:00:23,200 În acest caz, acesta este un program de C care acceptă un număr întreg de la utilizator, 10 00:00:23,200 --> 00:00:27,580 împarte câte două, și furnizează de ieșire înapoi la utilizator. 11 00:00:27,580 --> 00:00:30,610 Acum de la ceea ce am văzut mai devreme în prelegeri, 12 00:00:30,610 --> 00:00:34,370 știm că acest lucru va provoca de fapt, anumite tipuri de probleme Divizia 13 00:00:34,370 --> 00:00:35,860 atunci când avem numere impare. 14 00:00:35,860 --> 00:00:40,330 >> Mai exact, vom arunca doar departe ceva după virgulă. 15 00:00:40,330 --> 00:00:43,170 Acum, știm că acest lucru se întâmplă să fie cazul. 16 00:00:43,170 --> 00:00:47,430 Și dacă l-am rula, putem confirma suspiciunile noastre, în primul rând, prin elaborarea. 17 00:00:47,430 --> 00:00:50,460 Și apoi, de funcționare și introducerea unui număr impar. 18 00:00:50,460 --> 00:00:51,720 >> Acest lucru este nimic nou. 19 00:00:51,720 --> 00:00:54,490 Dar aceasta este de fapt o exemplu de un bug care 20 00:00:54,490 --> 00:00:58,810 poate exista în cadrul unui program mai larg care devine mai greu pentru a urmări în jos. 21 00:00:58,810 --> 00:01:02,640 Chiar dacă știm ce problema este, adevărata esența problemei 22 00:01:02,640 --> 00:01:06,250 ar putea fi încercarea de a identifica în special în cazul în care se produce eroarea, 23 00:01:06,250 --> 00:01:09,750 identificarea a ceea ce această problemă este, iar apoi fixare. 24 00:01:09,750 --> 00:01:14,400 Deci oferi acest lucru ca un exemplu de ceea ce ar putea fi ceva 25 00:01:14,400 --> 00:01:19,030 ca stim deja, dar poate fi îngropat în alte elemente ale codului. 26 00:01:19,030 --> 00:01:23,090 >> Deci, deschiderea acestei altă sursă Codul fișier ca un exemplu, 27 00:01:23,090 --> 00:01:27,165 această problemă divizie este acum parte a unui program mai larg. 28 00:01:27,165 --> 00:01:29,040 Încă ar putea fi un pic bit contrived, iar noi 29 00:01:29,040 --> 00:01:31,076 ar putea cu ușurință identifica, mai ales 30 00:01:31,076 --> 00:01:32,450 deoarece noi doar discutăm acest lucru. 31 00:01:32,450 --> 00:01:38,250 Dar ne putem da seama că această problema poate exista pe o scară mai mare. 32 00:01:38,250 --> 00:01:45,450 >> Dacă am compila acest lucru și acum rulați-l, introduceți un număr impar, 33 00:01:45,450 --> 00:01:49,816 putem vedea că nu ne precis ieșire ca să putem fi așteptat. 34 00:01:49,816 --> 00:01:51,690 În acest caz particular, am putea spune că ne-am 35 00:01:51,690 --> 00:01:56,060 vreau sa numere toate numerele de la o pana la un numar specific. 36 00:01:56,060 --> 00:01:58,130 Și putem vedea că ne au o varietate de probleme 37 00:01:58,130 --> 00:02:03,880 aici dacă suntem scoate, pur și simplu, 0 și 1 atunci când oferim o intrare de 5. 38 00:02:03,880 --> 00:02:07,380 >> Deci, noi știm deja că există o problemă aici. 39 00:02:07,380 --> 00:02:11,662 Dar noi nu să cunoască cu exactitate în cazul în care această problemă, de fapt există. 40 00:02:11,662 --> 00:02:13,620 Acum, unul dintre modurile în care putem încerca pentru a rezolva această 41 00:02:13,620 --> 00:02:15,745 este ceva ce ne-am fost deja prezentat. 42 00:02:15,745 --> 00:02:18,880 Putem doar folosi pe o scară mai mare. 43 00:02:18,880 --> 00:02:21,680 >> Pe linia 14, avem Această funcție printf, 44 00:02:21,680 --> 00:02:25,620 care ne permite pentru a imprima statului de diverse piese de informații. 45 00:02:25,620 --> 00:02:28,880 Și acest lucru este ceva ce ar trebui să fructifice în cadrul programului dumneavoastră 46 00:02:28,880 --> 00:02:33,100 pentru a încerca să dau seama exact ce este întâmplă în diferite linii de cod. 47 00:02:33,100 --> 00:02:36,350 Deci, chiar dacă acest lucru nu este rezultatul final că de fapt 48 00:02:36,350 --> 00:02:39,830 doresc să producă din acest program, noi încă 49 00:02:39,830 --> 00:02:42,300 ar putea avea unele depanare Declarații unde am 50 00:02:42,300 --> 00:02:46,970 pot încerca să dau seama exact ceea ce se întâmplă în interiorul codul nostru. 51 00:02:46,970 --> 00:02:51,210 >> Deci, în acest caz, voi printf cu tag-ul de depanare. 52 00:02:51,210 --> 00:02:53,540 În acest caz, aceasta este doar un șir de depanare 53 00:02:53,540 --> 00:02:56,840 că sunt up-inscrie astfel încât să devină foarte clar în producția de codul meu 54 00:02:56,840 --> 00:02:59,200 ceea ce este că vreau să arăt. 55 00:02:59,200 --> 00:03:04,410 Și de ieșire de aici numărul care le-am calculat. 56 00:03:04,410 --> 00:03:06,800 >> În acest caz, am putea vreau să știu cu precizie 57 00:03:06,800 --> 00:03:11,380 ceea ce se întâmplă înainte și după unele calcule specifice. 58 00:03:11,380 --> 00:03:16,224 Deci, s-ar putea folosi un printf înainte și după aceea linie de cod. 59 00:03:16,224 --> 00:03:18,640 În acest caz, am putut chiar fac din el un pic mai mult clar 60 00:03:18,640 --> 00:03:21,960 prin a spune depanare înainte și depanare după așa 61 00:03:21,960 --> 00:03:26,540 care nu mă confunda cu mai multe linii, care arata identic. 62 00:03:26,540 --> 00:03:32,290 >> Acum, dacă am recompilați această și a alerga aceasta, introduceți un număr de cinci ca, din nou, 63 00:03:32,290 --> 00:03:35,090 putem vedea că avem acum ieșire înainte și după 64 00:03:35,090 --> 00:03:40,670 și pentru a găsi că nu am făcut-o clar divizare sau clară cu numărul 65 00:03:40,670 --> 00:03:43,680 că de fapt vrei sa faci. 66 00:03:43,680 --> 00:03:48,660 Acum, în acest caz, aceasta este nu într-adevăr o ieșire clar. 67 00:03:48,660 --> 00:03:52,440 Nu e chiar un rezultat clar că vrem din acest program special. 68 00:03:52,440 --> 00:03:54,427 >> Și acest lucru este, din nou, un pic contrived. 69 00:03:54,427 --> 00:03:57,510 Dar, poate, unul dintre lucrurile pe care am putea face în cazul în care caietul de sarcini a declarat 70 00:03:57,510 --> 00:04:01,900 că vrem să împartă acest lucru prin 2 și se adaugă 1-- așa în alte cuvinte, 71 00:04:01,900 --> 00:04:04,550 vrem să rotunjească up-- apoi am să știe că am putea 72 00:04:04,550 --> 00:04:08,060 face acest lucru special, în acest caz. 73 00:04:08,060 --> 00:04:14,010 Acum aici știm că vom fi posibilitatea de a adăuga 1 la numărul nostru înjumătățit. 74 00:04:14,010 --> 00:04:16,490 >> Să recompilați acest și confirmă faptul că această 75 00:04:16,490 --> 00:04:18,860 se comportă modul în care dorim să. 76 00:04:18,860 --> 00:04:21,980 Putem vedea că acum înainte având, avem numărul 5. 77 00:04:21,980 --> 00:04:26,620 După ce, avem numărul 3, care, conform specificatiilor noastre, 78 00:04:26,620 --> 00:04:29,292 este ceea ce am vrut să fac. 79 00:04:29,292 --> 00:04:31,000 Dar dacă ne uităm la ieșire aici, putem 80 00:04:31,000 --> 00:04:33,760 vedea că am putea avea un alt bug totul, ceea ce este 81 00:04:33,760 --> 00:04:36,940 că începem Nr nostru de la 0. 82 00:04:36,940 --> 00:04:39,390 >> Acum, din nou, acest lucru este ceva care le-am văzut în trecut 83 00:04:39,390 --> 00:04:42,500 și putem repara destul de ușor. 84 00:04:42,500 --> 00:04:44,790 Dar, în acest caz, ne-am avut, de asemenea, în beneficiul 85 00:04:44,790 --> 00:04:48,940 de utilizare a declarației printf direct în interiorul pentru bucla 86 00:04:48,940 --> 00:04:52,930 să știe exact unde care eroare a fost loc. 87 00:04:52,930 --> 00:04:55,150 Declarații Deci printf sunt foarte util în a ajuta 88 00:04:55,150 --> 00:04:57,940 te determina unde, tocmai în codul sursă, 89 00:04:57,940 --> 00:05:00,620 o eroare specific are loc. 90 00:05:00,620 --> 00:05:03,650 >> Și este, de asemenea, important să realizăm că, așa cum ne scrierea de cod, 91 00:05:03,650 --> 00:05:06,052 am putea avea ipoteze cu privire la starea unui program. 92 00:05:06,052 --> 00:05:08,510 Sau am putea avea ipoteze despre ce parte a programului 93 00:05:08,510 --> 00:05:13,020 este, de fapt corecte sau incorecte, atunci când mai târziu cum am construi pe acest program 94 00:05:13,020 --> 00:05:15,950 și să-l dintr-o parte complexă și mai mare program de 95 00:05:15,950 --> 00:05:19,700 că ne dăm seama că unele aspecte de care este de fapt buggy. 96 00:05:19,700 --> 00:05:22,680 >> Utilizarea printf poate ajuta cu adevarat restrânge și de a identifica 97 00:05:22,680 --> 00:05:26,430 regiunile un program care nu pot se comporta exact modul în care ne 98 00:05:26,430 --> 00:05:29,500 se așteaptă, bazate pe ipoteze noastre. 99 00:05:29,500 --> 00:05:31,460 Dar există alte instrumente disponibil, de asemenea, 100 00:05:31,460 --> 00:05:34,860 care ne permit să încercați să descoperiți unde o eroare se produce 101 00:05:34,860 --> 00:05:39,930 și, de asemenea, în mod specific, ce lucruri se întâmplă în interiorul programului. 102 00:05:39,930 --> 00:05:41,990 >> Deci, folosind printf este foarte când ne-o dorim util 103 00:05:41,990 --> 00:05:45,900 pentru a identifica zonele specifice de un program care avea unele bug. 104 00:05:45,900 --> 00:05:47,730 Dar devine, de asemenea, plictisitor după un timp. 105 00:05:47,730 --> 00:05:50,500 În acest caz, aceasta este o Programul relativ simplu 106 00:05:50,500 --> 00:05:52,750 cu doar una sau două variabile. 107 00:05:52,750 --> 00:05:57,260 Si devine foarte ușor pentru noi să imprima valoarea acestor variabile 108 00:05:57,260 --> 00:05:59,670 în contextul programului mai larg. 109 00:05:59,670 --> 00:06:02,670 >> Dar am putea avea un alt program care are multe variabile. 110 00:06:02,670 --> 00:06:06,530 Și nu poate fi destul de atât de ușor de utilizat printf 111 00:06:06,530 --> 00:06:10,120 pentru a încerca să evalueze ceea ce se întâmplă la fiecare dintre aceste variabile 112 00:06:10,120 --> 00:06:13,590 ca programul este de executare. 113 00:06:13,590 --> 00:06:16,960 Există un program care există numit un program de depanare. 114 00:06:16,960 --> 00:06:20,320 În acest caz, cel care vom utilizare este debugger GNU, sau GDB, 115 00:06:20,320 --> 00:06:24,260 care ne permite să inspecteze interne lucrări de un program într-un mult mai 116 00:06:24,260 --> 00:06:25,700 mod detaliat. 117 00:06:25,700 --> 00:06:28,810 >> Putem executa de fapt GDB din linia de comandă 118 00:06:28,810 --> 00:06:35,370 aici prin simpla tastarea GDB și comandă care ne-o dorim pentru a depana. 119 00:06:35,370 --> 00:06:37,550 În acest caz, conta. 120 00:06:37,550 --> 00:06:41,650 Acum, în acest caz, putem vedea că ne aduce la un prompt care spune GDB. 121 00:06:41,650 --> 00:06:44,020 Și putem, de fapt executa comenzi pentru GDB 122 00:06:44,020 --> 00:06:48,260 pentru a începe de fapt executarea Programul, oprește-te în anumite puncte, 123 00:06:48,260 --> 00:06:51,060 evalua variabilele și inspecta variabilele care 124 00:06:51,060 --> 00:06:54,152 există în starea de programul la acel moment, 125 00:06:54,152 --> 00:06:55,110 și așa mai departe și așa mai departe. 126 00:06:55,110 --> 00:06:57,240 Acesta oferă o mulțime de puterea de a ne. 127 00:06:57,240 --> 00:06:59,960 >> Dar doar așa se întâmplă că IDE CS50, de asemenea, 128 00:06:59,960 --> 00:07:05,870 oferă o interfață grafică sau un utilizator interfață pentru GDB care 129 00:07:05,870 --> 00:07:11,120 ne permite să facem acest lucru fără a fi nevoie linie de comandă fel interfața 130 00:07:11,120 --> 00:07:13,560 sau la toate, chiar. 131 00:07:13,560 --> 00:07:16,930 Modul în care pot accesa că este folosind butonul depanare 132 00:07:16,930 --> 00:07:20,120 la foarte de sus a IDE CS50. 133 00:07:20,120 --> 00:07:24,280 Acum, în trecut, ceea ce avem văzut este că vom folosi comanda 134 00:07:24,280 --> 00:07:27,660 linie pentru a compila și apoi executați un program de. 135 00:07:27,660 --> 00:07:29,790 >> Butonul de depanare nu aceste două etape. 136 00:07:29,790 --> 00:07:34,380 Dar, de asemenea, va aduce la Fila debugger pe extrema dreaptă 137 00:07:34,380 --> 00:07:38,280 care ne permite să inspecteze o varietate de proprietăți ale programului 138 00:07:38,280 --> 00:07:40,500 așa cum este de executare. 139 00:07:40,500 --> 00:07:44,280 Dacă am faceți clic pe depanare, în acest caz, se va aduce 140 00:07:44,280 --> 00:07:48,230 o filă nouă în consola fereastră în partea de jos. 141 00:07:48,230 --> 00:07:51,160 >> Și puteți vedea că această filă are unele informații la foarte de sus. 142 00:07:51,160 --> 00:07:52,670 Și putem ignora în mare măsură acest lucru. 143 00:07:52,670 --> 00:07:54,800 Dar unul dintre lucrurile pe care le care ne-o dorim pentru a observa 144 00:07:54,800 --> 00:07:57,170 este faptul că ieșirile același lucru pe care îl 145 00:07:57,170 --> 00:08:03,000 ar obține dacă am încercat să ruleze face pe programul C în fereastra terminalului. 146 00:08:03,000 --> 00:08:06,230 >> Aici, putem vedea că se execută zăngănit, și are o varietate de steaguri, 147 00:08:06,230 --> 00:08:12,660 și este compilarea dosarul nostru count.c, care a fost fila selectată la momentul 148 00:08:12,660 --> 00:08:15,100 că am lovit de depanare. 149 00:08:15,100 --> 00:08:18,010 Deci acest lucru este foarte util, deoarece acum folosind acest buton depanare, 150 00:08:18,010 --> 00:08:23,280 putem compila simultan și apoi executa programul pe care suntem de fapt 151 00:08:23,280 --> 00:08:24,460 doriți să o executați. 152 00:08:24,460 --> 00:08:27,880 >> Unul dintre steagurile care este importantă, în acest caz, 153 00:08:27,880 --> 00:08:30,190 am fost, de fapt, folosind pentru cel mai lung timp 154 00:08:30,190 --> 00:08:32,450 dar, de asemenea a făcut doar câteva mână fluturând [auzite], care 155 00:08:32,450 --> 00:08:33,820 este cea de aici. 156 00:08:33,820 --> 00:08:35,790 În zăngăni, se spune -ggdb3. 157 00:08:35,790 --> 00:08:38,570 158 00:08:38,570 --> 00:08:41,250 În acest caz, ceea ce suntem spune zăngăni, compilator nostru, 159 00:08:41,250 --> 00:08:43,820 este că vrem să compila programul nostru. 160 00:08:43,820 --> 00:08:46,810 Dar oferă, de asemenea, care sunt numit informații simbol 161 00:08:46,810 --> 00:08:50,940 astfel încât compilatorul are de fapt acces la o mulțime de informații care stau la baza 162 00:08:50,940 --> 00:08:52,610 conținute în cadrul programului. 163 00:08:52,610 --> 00:08:55,260 >> Mai precis, numărul de funcții pe care le am, 164 00:08:55,260 --> 00:08:58,000 numele acestor funcții, variabilele, tipurile 165 00:08:58,000 --> 00:09:01,730 că aceste variabile sunt, și o varietate de alte lucruri care ajuta debugger 166 00:09:01,730 --> 00:09:04,350 efectuarea operației acestuia. 167 00:09:04,350 --> 00:09:06,600 Acum mai e ceva care este important de menționat 168 00:09:06,600 --> 00:09:10,280 când suntem discutăm de funcționare un program în acest fel. 169 00:09:10,280 --> 00:09:13,660 >> Observați că are de fapt adus o nouă filă în consolă nostru 170 00:09:13,660 --> 00:09:14,780 a lungul părții inferioare. 171 00:09:14,780 --> 00:09:18,600 Noi nu mai trebuie să interacționeze direct cu fereastra terminal. 172 00:09:18,600 --> 00:09:21,420 Dar această nouă filă este de fapt, o fereastră de terminal. 173 00:09:21,420 --> 00:09:26,710 Pur și simplu este specific de funcționare Programul care le-am creat. 174 00:09:26,710 --> 00:09:29,270 >> Observați că în partea de jos, în combinație cu unele de ieșire 175 00:09:29,270 --> 00:09:33,500 de clang compilator și GDB, care putem ignora în mare măsură, 176 00:09:33,500 --> 00:09:37,570 se arată de fapt datele de ieșire ale programul nostru de la foarte partea de jos. 177 00:09:37,570 --> 00:09:41,240 Acum este important să realizăm că aceasta fereastra de fapt 178 00:09:41,240 --> 00:09:43,360 vă va arăta ieșire din program 179 00:09:43,360 --> 00:09:47,190 dar, de asemenea, poate accepta intrare pentru acest program, de asemenea. 180 00:09:47,190 --> 00:09:49,260 >> Deci observați că spune Vă rugăm să introduceți un număr, 181 00:09:49,260 --> 00:09:53,050 care este aceeași ieșire pe care am avut a avut în fereastra terminalului înainte. 182 00:09:53,050 --> 00:09:55,510 Dar este acum arătat în această nouă filă. 183 00:09:55,510 --> 00:09:56,550 Pot introduce un număr. 184 00:09:56,550 --> 00:10:00,900 Și va de fapt funcționează ca ne asteptam 185 00:10:00,900 --> 00:10:05,890 arătându-ne depanare noastră, de ieșire, de ieșire care ar putea fi buggy, 186 00:10:05,890 --> 00:10:07,010 cum am văzut mai înainte. 187 00:10:07,010 --> 00:10:10,460 Și chiar la partea de jos, ea are de fapt, unele de ieșire suplimentare 188 00:10:10,460 --> 00:10:14,550 din PIB, doar spune că acest program a finalizat. 189 00:10:14,550 --> 00:10:16,655 >> Acum, ați văzut în acest special alerga prin, 190 00:10:16,655 --> 00:10:19,370 aceasta nu a fost deosebit utile, deoarece chiar 191 00:10:19,370 --> 00:10:23,740 deși am avut venit din meniul debugger up, aceasta era încă un program care rulează. 192 00:10:23,740 --> 00:10:26,790 La nici un punct a făcut de fapt pauză de executie pentru noi 193 00:10:26,790 --> 00:10:30,767 pentru a putea inspecta toate variabilele conținuți. 194 00:10:30,767 --> 00:10:32,850 Mai e ceva că trebuie să facem pentru 195 00:10:32,850 --> 00:10:36,910 pentru a obține GDB să recunoască faptul că ne-o dorim pentru a întrerupe executarea programului 196 00:10:36,910 --> 00:10:42,820 și să nu permită doar să procedeze în mod normal, așa cum ne-ar în orice alt caz. 197 00:10:42,820 --> 00:10:45,530 >> În scopul de a întrerupe executarea, la o linie specifică, 198 00:10:45,530 --> 00:10:47,830 avem nevoie pentru a crea ceea ce este numit un punct de pauză. 199 00:10:47,830 --> 00:10:52,670 Și un punct de pauză este foarte usor creat în acest CS50 IDE prin luarea mouse-ul 200 00:10:52,670 --> 00:10:57,090 și făcând clic direct la stânga de un numar linie specifică. 201 00:10:57,090 --> 00:10:59,920 După ce am făcut asta, un punct roșu Apare, ceea ce indică 202 00:10:59,920 --> 00:11:02,300 că această linie este acum un punct de pauză. 203 00:11:02,300 --> 00:11:07,540 >> Și data viitoare pe care am rulat GDB l, va opri executia la acel punct de spargere 204 00:11:07,540 --> 00:11:10,280 atunci când aceasta ajunge ca linie de cod. 205 00:11:10,280 --> 00:11:12,230 Acum, acest lucru este un important lucru pentru a realiza 206 00:11:12,230 --> 00:11:16,140 că nu este neapărat cazul în care fiecare linie de cod 207 00:11:16,140 --> 00:11:17,880 este, de fapt accesibilă. 208 00:11:17,880 --> 00:11:23,780 Daca as fi fost de a crea o funcție aici, pentru f-- void example-- 209 00:11:23,780 --> 00:11:31,230 și de a face doar o linie de imprimare here-- salut world-- dacă nu eu numesc această funcție, 210 00:11:31,230 --> 00:11:34,770 acesta va fi cazul în care, dacă am stabilit un punct de pauză aici, 211 00:11:34,770 --> 00:11:36,220 funcția nu va fi numit. 212 00:11:36,220 --> 00:11:38,310 De aceea, această special punctul pauză 213 00:11:38,310 --> 00:11:43,040 nu va întrerupe de fapt executarea programului. 214 00:11:43,040 --> 00:11:48,020 >> Deci, haideți să spun că am crea corect un punct de pauză pe unele linie de cod 215 00:11:48,020 --> 00:11:50,340 care va fi real executate. 216 00:11:50,340 --> 00:11:53,470 Acum, în acest caz, aceasta este prima linie în funcția principală. 217 00:11:53,470 --> 00:11:56,630 Deci, va fi cu siguranță cazul că, de îndată ce voi începe executarea, 218 00:11:56,630 --> 00:11:58,580 prima linie va fi atins. 219 00:11:58,580 --> 00:12:00,230 GDB va întrerupe executarea. 220 00:12:00,230 --> 00:12:04,100 Și apoi, voi fi capabil să interacționa cu debugger. 221 00:12:04,100 --> 00:12:08,480 >> Puteți seta mai multe linii ar fi valori critice, dacă doriți. 222 00:12:08,480 --> 00:12:11,365 Putem crea, de asemenea, o linie de până aici, în acest segment de cod 223 00:12:11,365 --> 00:12:12,490 care nu va fi atins. 224 00:12:12,490 --> 00:12:14,744 Și putem, de asemenea, seta o mai jos. 225 00:12:14,744 --> 00:12:16,660 Motivul pentru care ne-ar vrei sa faci acest lucru ne vom 226 00:12:16,660 --> 00:12:19,119 du-te în un pic mai mult detaliu intr-o clipa. 227 00:12:19,119 --> 00:12:21,660 Deci, pentru moment, lasă-mă să dezactivați aceste puncte de pauză suplimentare 228 00:12:21,660 --> 00:12:24,940 astfel încât să ne putem uita la ceea ce se întâmplă atunci când am o pauză singur 229 00:12:24,940 --> 00:12:27,650 punct în programul meu. 230 00:12:27,650 --> 00:12:29,410 Am făcut unele modificări la acest program. 231 00:12:29,410 --> 00:12:30,750 Așa că am nevoie să-l salveze. 232 00:12:30,750 --> 00:12:34,490 Voi faceți clic pe de depanare, astfel încât pot începe elaborarea și apoi 233 00:12:34,490 --> 00:12:36,880 executarea debugger. 234 00:12:36,880 --> 00:12:40,632 >> Vom vedea că, după momente, linie care am selectat ca pauză 235 00:12:40,632 --> 00:12:43,360 punct este evidențiat în galben. 236 00:12:43,360 --> 00:12:47,440 Se poate observa, de asemenea, că, în dreapta sus în panoul de depanare 237 00:12:47,440 --> 00:12:50,940 că icoana pauză sa transformat într-o pictogramă joc pic. 238 00:12:50,940 --> 00:12:54,710 Acest lucru înseamnă că avem pauză execuție, în acest caz particular. 239 00:12:54,710 --> 00:12:57,840 Și lovind pe butonul Redare va ne permit să-și reia executarea 240 00:12:57,840 --> 00:13:00,000 în acel moment specific. 241 00:13:00,000 --> 00:13:03,240 >> Observați că există o serie de alte butoane disponibile în acest panou de depanare, 242 00:13:03,240 --> 00:13:04,220 deasemenea. 243 00:13:04,220 --> 00:13:09,470 Pasul pe care îmi permite să executa că o linie de cod 244 00:13:09,470 --> 00:13:14,030 și pas pe la acea linie la o viitoare, care, în acest caz, 245 00:13:14,030 --> 00:13:17,060 ar însemna că printf declarație este executată. 246 00:13:17,060 --> 00:13:22,310 Și se va face o pauză, apoi execuție pe linia 13, cum ar fi așa. 247 00:13:22,310 --> 00:13:25,090 >> Și există, de asemenea, un pas în funcție, care 248 00:13:25,090 --> 00:13:28,950 este util dacă am creat alte funcții în altă parte în codul sursă. 249 00:13:28,950 --> 00:13:31,420 Și vreau să-și intensifice în aceste funcții, mai degrabă decât 250 00:13:31,420 --> 00:13:33,050 executa care funcționează ca un întreg. 251 00:13:33,050 --> 00:13:37,279 Dar ne vom uita mai mult la etapa în funcție într-o clipă. 252 00:13:37,279 --> 00:13:40,320 Acum, observați alte lucruri care Există de fapt, în acest panou de depanare. 253 00:13:40,320 --> 00:13:44,110 >> Avem acest panou numită Call Stack, care ne arată 254 00:13:44,110 --> 00:13:45,300 unde suntem. 255 00:13:45,300 --> 00:13:48,550 În acest caz, noi suntem în interiorul din funcția principală. 256 00:13:48,550 --> 00:13:50,880 Script-ul nostru se numește count.c. 257 00:13:50,880 --> 00:13:53,820 Și se întâmplă să fie pe linia 13, coloana unu, care 258 00:13:53,820 --> 00:13:58,950 este exact ceea ce regiunea a subliniat din codul sursă indică, de asemenea. 259 00:13:58,950 --> 00:14:02,435 >> Acum, observați că acest lucru arată, de asemenea, în secțiunea variabilă locale 260 00:14:02,435 --> 00:14:06,710 toate variabilele care există în această funcție. 261 00:14:06,710 --> 00:14:08,930 Este important să rețineți că toate variabilele 262 00:14:08,930 --> 00:14:12,580 va apărea în această variabilă locală secțiune în cadrul unei funcții, 263 00:14:12,580 --> 00:14:14,380 chiar înainte de a fi definite. 264 00:14:14,380 --> 00:14:19,160 Putem vedea aici că avem o variabilă numit num, are o valoare implicită de la 0, 265 00:14:19,160 --> 00:14:21,280 și este de tipul int. 266 00:14:21,280 --> 00:14:24,110 >> Acum, înainte de a inițializa de fapt toate aceste variabile, 267 00:14:24,110 --> 00:14:26,685 nu suntem neapărat garantat pentru a vedea o valoare de la 0. 268 00:14:26,685 --> 00:14:29,200 Și în funcție de alte executii care le-au efectuat 269 00:14:29,200 --> 00:14:32,020 și starea de memorie, atunci când executați de fapt acest program, 270 00:14:32,020 --> 00:14:34,605 s-ar putea găsi pe care le nu văd valori de 0 271 00:14:34,605 --> 00:14:36,550 și, în schimb, alte numere de nebun. 272 00:14:36,550 --> 00:14:38,390 >> Dar nu vă faceți griji despre asta. 273 00:14:38,390 --> 00:14:44,610 Nu va fi relevant până inițializați de fapt valoarea. 274 00:14:44,610 --> 00:14:49,630 Acum, în acest caz, putem vedea că Am efectuat unele rezultate. 275 00:14:49,630 --> 00:14:52,131 Și eu, chiar acum, o pauză de executie. 276 00:14:52,131 --> 00:14:53,880 Dar, în acest caz, ceea ce Eu chiar vreau să fac 277 00:14:53,880 --> 00:14:58,060 este să-și intensifice acum peste această linie de cod astfel încât să pot de fapt 278 00:14:58,060 --> 00:15:04,390 interogarea utilizatorului pentru care int care vrem sa folosim în programul nostru. 279 00:15:04,390 --> 00:15:07,060 >> Acum, în acest caz, atunci când Am lovit pas peste, aviz 280 00:15:07,060 --> 00:15:11,940 că pauză sau, mai degrabă CV-ul Butonul a schimbat la acest buton Pauză 281 00:15:11,940 --> 00:15:14,022 deoarece acest cod este, de fapt de executare. 282 00:15:14,022 --> 00:15:15,730 Ce se întâmplă acum este faptul că este 283 00:15:15,730 --> 00:15:21,630 ne așteaptă pentru a introduce câteva informații așa cum putem vedea prin textul nostru de ieșire 284 00:15:21,630 --> 00:15:23,600 în partea de jos. 285 00:15:23,600 --> 00:15:25,787 >> Deci acum, aceasta este de fapt, nu se opri, 286 00:15:25,787 --> 00:15:28,620 chiar dacă, un fel de pare, să fie pentru că nu se întâmplă nimic. 287 00:15:28,620 --> 00:15:32,360 Dar doar așa se întâmplă că, în cazul meu specific pe linia 13, 288 00:15:32,360 --> 00:15:34,210 Sunt de așteptare pentru introduse de utilizator. 289 00:15:34,210 --> 00:15:39,130 Și așa GDB nu este capabil de a inspecta un program ca acesta este în funcțiune. 290 00:15:39,130 --> 00:15:43,370 >> Acum, data viitoare pe care am intra unele input-- așa că vom introduce acest număr de 5, 291 00:15:43,370 --> 00:15:46,140 așa cum am văzut în past-- lovit de returnare, iar noi 292 00:15:46,140 --> 00:15:51,430 observă că, imediat, pauze GDB și, din nou, subliniaza linia următoare. 293 00:15:51,430 --> 00:15:55,320 Dar observați că acum, ca un rezultat al introducerea nostru o valoare, 294 00:15:55,320 --> 00:15:58,930 am actualizat acea valoare în interiorul variabilelor noastre locale, care 295 00:15:58,930 --> 00:16:05,560 este foarte util să cunoască cu exactitate ce acest număr a fost în memorie. 296 00:16:05,560 --> 00:16:10,650 >> Acum pot permite acest program pentru a continua joc până la sfârșitul execuției sale 297 00:16:10,650 --> 00:16:12,570 prin lovirea Reluare. 298 00:16:12,570 --> 00:16:16,410 Putem vedea că foarte repede nu termina programul de executare 299 00:16:16,410 --> 00:16:19,790 cu aceeași ieșire pe care le a avut înainte, debugger se închide, 300 00:16:19,790 --> 00:16:23,170 iar acum acest program sa oprit complet. 301 00:16:23,170 --> 00:16:25,320 >> Am arată că numai pentru scopul de a vedea ceea ce 302 00:16:25,320 --> 00:16:27,280 se întâmplă atunci când ne-am lovit de fapt Reluare. 303 00:16:27,280 --> 00:16:30,640 Dar noi, de fapt de gând să vreau să mă întorc în acest program 304 00:16:30,640 --> 00:16:33,820 astfel încât să putem încerca pentru a depana exact ceea ce se întâmplă. 305 00:16:33,820 --> 00:16:37,980 Acum, că eu sunt, folosind debugger, am putea nu au nevoie de aceste declarații depanare printf. 306 00:16:37,980 --> 00:16:43,860 >> Așa că am putea să le eliminați ca voi face acum doar pentru a reveni la codul nostru simplu 307 00:16:43,860 --> 00:16:45,950 că am avut-o acum un moment. 308 00:16:45,950 --> 00:16:48,790 Acum, când am salva programa și executa, 309 00:16:48,790 --> 00:16:53,700 va, din nou, du-te la faptul că inițial punct pe care am avut pe linia 11 rupe. 310 00:16:53,700 --> 00:16:57,700 Și voi fi în măsură să inspecteze variabile mele ca vreau sa fac. 311 00:16:57,700 --> 00:17:00,695 >> Este doar așa se întâmplă că această parte nu este foarte interesant, 312 00:17:00,695 --> 00:17:04,364 Și știu că am de gând pentru a imprima această declarație. 313 00:17:04,364 --> 00:17:05,280 Vă rugăm să introduceți un număr. 314 00:17:05,280 --> 00:17:08,099 Și apoi, eu știu că am de gând pentru a cere utilizatorului pentru care întreg. 315 00:17:08,099 --> 00:17:13,329 Deci, poate, de fapt, vreau să se mute meu punct de pauză un pic mai jos. 316 00:17:13,329 --> 00:17:16,710 >> Puteți elimina puncte de pauză făcând clic, din nou, în mod direct 317 00:17:16,710 --> 00:17:18,460 în partea stângă a liniei care numărul. 318 00:17:18,460 --> 00:17:22,200 Care red dot va dispărea, indicând că punct de pauză este acum plecat. 319 00:17:22,200 --> 00:17:24,780 Acum, în acest caz, execuție a fost întreruptă. 320 00:17:24,780 --> 00:17:27,770 Și așa nu este de fapt de gând să relua în acest caz particular. 321 00:17:27,770 --> 00:17:30,210 Dar pot seta o pauză litera un pic mai târziu. 322 00:17:30,210 --> 00:17:33,880 >> Și când am acum CV-ul meu cod, se va relua și spune 323 00:17:33,880 --> 00:17:36,190 punctul de care punct de spargere. 324 00:17:36,190 --> 00:17:37,374 Din nou, am lovit Reluare. 325 00:17:37,374 --> 00:17:39,040 Nu pare a fi ceva se întâmplă. 326 00:17:39,040 --> 00:17:41,450 Dar asta e din cauza mea Codul este în așteptare pentru intrare. 327 00:17:41,450 --> 00:17:47,900 Voi introduce un număr de 5, apăsați pe Enter, și acum următorul punct de spargere va fi lovit. 328 00:17:47,900 --> 00:17:50,570 >> Acum, în acest caz, aceasta este linia de cod 329 00:17:50,570 --> 00:17:53,820 că, mai înainte, am stiut sa întâmplat să fie buggy. 330 00:17:53,820 --> 00:17:57,590 Deci, haideți să evalueze ceea ce se întâmplă în acest moment special de timp. 331 00:17:57,590 --> 00:18:02,620 Atunci când o linie este evidențiat, acest line nu a fost încă executată. 332 00:18:02,620 --> 00:18:06,490 Deci, în acest caz, putem vedea că am un număr, care 333 00:18:06,490 --> 00:18:11,610 Am un întreg numit num care are o valoare de 5. 334 00:18:11,610 --> 00:18:15,090 Și am de gând să fie performante unele matematica la acel număr. 335 00:18:15,090 --> 00:18:20,130 >> Dacă aș pas peste care, putem observați că valoarea de num 336 00:18:20,130 --> 00:18:23,780 sa schimbat în conformitate cu aritmetică că am făcut de fapt. 337 00:18:23,780 --> 00:18:26,810 Și acum că suntem de acest lucru pentru bucla interior 338 00:18:26,810 --> 00:18:29,090 sau acum că pentru bucla în sine este evidențiată, 339 00:18:29,090 --> 00:18:32,450 vom vedea că avem o nouă variabilă-am numit ca 340 00:18:32,450 --> 00:18:35,370 va fi utilizat în bucla for. 341 00:18:35,370 --> 00:18:38,230 >> Acum, amintiți-vă, înainte de care am menționat că, uneori, esti 342 00:18:38,230 --> 00:18:43,470 O să văd un fel de nebun Numerele în mod implicit, înainte de acel număr 343 00:18:43,470 --> 00:18:45,530 sau care este variabila de fapt inițializat. 344 00:18:45,530 --> 00:18:49,040 Putem vedea că tocmai aici, în această variabilă 345 00:18:49,040 --> 00:18:51,345 numit i, care nu are a fost încă inițializat 346 00:18:51,345 --> 00:18:53,560 în momentul evidențierea. 347 00:18:53,560 --> 00:18:57,070 Dar putem vedea că are unele număr că nu ne-ar aștepta de fapt. 348 00:18:57,070 --> 00:18:57,620 >> Asta e ok. 349 00:18:57,620 --> 00:18:59,661 Nu vă faceți griji pentru că nu am de fapt, 350 00:18:59,661 --> 00:19:04,970 inițializat acest număr până când am pas pe această linie și valoarea 351 00:19:04,970 --> 00:19:08,560 i a fost inițializat cu valoarea 1. 352 00:19:08,560 --> 00:19:11,400 Deci, pentru a vedea că de fapt cazul, să-și intensifice pe. 353 00:19:11,400 --> 00:19:14,420 Putem vedea acum că line a fost executată. 354 00:19:14,420 --> 00:19:17,000 Și noi suntem acum subliniind această linie printf. 355 00:19:17,000 --> 00:19:22,230 >> Și putem vedea acum cum valorile noastre de i si 3 s-au schimbat în timp. 356 00:19:22,230 --> 00:19:26,450 Acest lucru este foarte util pentru a face, de fapt, este să-și intensifice prin linii în mod repetat. 357 00:19:26,450 --> 00:19:30,480 Și puteți găsi de fapt, ceea ce se întâmplă în interiorul pentru bucla dvs. 358 00:19:30,480 --> 00:19:33,660 și ce se întâmplă cu variabile în interiorul că pentru bucla 359 00:19:33,660 --> 00:19:39,200 ca și execuția programului apare un pas la un moment dat. 360 00:19:39,200 --> 00:19:41,110 >> Acum, în acest moment, am păși peste suficient 361 00:19:41,110 --> 00:19:44,210 că acum eu sunt la sfârșitul programului meu. 362 00:19:44,210 --> 00:19:46,980 Dacă aș pas peste asta, va încetează de fapt de executie 363 00:19:46,980 --> 00:19:48,860 așa cum am văzut în trecut. 364 00:19:48,860 --> 00:19:52,110 Lasă-mă să reporniți acest, încă o dată, astfel încât că pot indica altceva, 365 00:19:52,110 --> 00:19:53,320 deasemenea. 366 00:19:53,320 --> 00:19:55,350 >> În acest caz, este acum mă întrebi, din nou, 367 00:19:55,350 --> 00:19:57,100 pentru un număr, care Voi, din nou, introduceți. 368 00:19:57,100 --> 00:20:00,300 Dar de data asta, am de gând să intre în un număr mai mare, astfel încât pentru bucla 369 00:20:00,300 --> 00:20:02,540 va repeta de mai multe ori. 370 00:20:02,540 --> 00:20:06,090 În acest caz, am de gând pentru a introduce o valoare de 11. 371 00:20:06,090 --> 00:20:08,390 >> Acum, din nou pentru că aș stabilit un punct de pauză la linia 15, 372 00:20:08,390 --> 00:20:10,490 este de gând să sublinieze faptul că linia. 373 00:20:10,490 --> 00:20:12,980 Putem vedea că nostru Numărul 11 ​​este corect 374 00:20:12,980 --> 00:20:15,560 reprezentată în variabilele noastre locale. 375 00:20:15,560 --> 00:20:22,460 Trecând peste asta, putem acum ceas ce se întâmplă cu valoarea noastra de i 376 00:20:22,460 --> 00:20:25,680 așa cum am proceda în interiorul asta pentru bucla. 377 00:20:25,680 --> 00:20:31,960 Acesta se crește de fiecare dată când ajunge la partea de sus a că, pentru bucla. 378 00:20:31,960 --> 00:20:35,110 >> Acum, unul dintre lucrurile pe care ar putea fi util de făcut în timpul execuției 379 00:20:35,110 --> 00:20:40,490 acestui program este pentru mine de a efectiv schimba midstream variabilele pentru a vedea 380 00:20:40,490 --> 00:20:42,450 ce se întâmplă cu programul meu. 381 00:20:42,450 --> 00:20:46,540 În acest caz, pot de fapt faceți dublu clic pe valoarea. 382 00:20:46,540 --> 00:20:48,040 Observați că acesta devine un câmp de text. 383 00:20:48,040 --> 00:20:50,280 >> Acum pot intra diferite valoare cu totul 384 00:20:50,280 --> 00:20:55,700 pentru a vedea cum se comportă programul meu când m-am schimbat variabila. 385 00:20:55,700 --> 00:20:59,560 Acum, în acest caz, variabila I conține acum valoarea de 10. 386 00:20:59,560 --> 00:21:02,810 Dar programul este încă opri în execuție. 387 00:21:02,810 --> 00:21:07,610 Când m-am pas peste, am vedea că Am valoare, pe care am introdus ca 10, 388 00:21:07,610 --> 00:21:12,170 nu este mai mare decât valoarea de num, care provoacă imediat pentru bucla 389 00:21:12,170 --> 00:21:14,240 pentru a opri executarea. 390 00:21:14,240 --> 00:21:16,210 >> Acum, că nu este singurul motiv pentru care ar 391 00:21:16,210 --> 00:21:19,450 doriți să modificați variabila în loc. 392 00:21:19,450 --> 00:21:22,210 S-ar putea dori de fapt, pentru a încerca să-l modifice, astfel 393 00:21:22,210 --> 00:21:24,590 încât să puteți continua executarea unei bucle 394 00:21:24,590 --> 00:21:27,370 sau astfel încât să puteți modifica o valoare înainte de a 395 00:21:27,370 --> 00:21:32,630 ajunge unele set specific de aritmetică că sunteți pe cale de a efectua. 396 00:21:32,630 --> 00:21:36,210 >> Deci, acum că am schimba de fapt valoarea lui I ca programul a fost de executare, 397 00:21:36,210 --> 00:21:39,540 aceasta a cauzat de bucla pentru a iesi prematur, deoarece, dintr-o dată, m-am 398 00:21:39,540 --> 00:21:42,770 întâmplat să fie mai mare decât valoarea de num, ceea ce înseamnă că pentru bucla 399 00:21:42,770 --> 00:21:45,410 nu mai sunt necesare pentru a fi executate. 400 00:21:45,410 --> 00:21:48,780 Mai mult, sa întâmplat să fie cazul în care am schimbat valoarea lui I 401 00:21:48,780 --> 00:21:53,270 când a fost evidențiată linia 17, care a fost punctul în timp 402 00:21:53,270 --> 00:21:56,280 că pentru executarea bucla a fost de fapt în curs de evaluare. 403 00:21:56,280 --> 00:22:00,210 >> Dacă aș fi schimbat valoarea Am pe o linie diferită, spun 19, 404 00:22:00,210 --> 00:22:03,360 ne-ar fi văzut diferit Comportamentul deoarece linia 19 ar fi 405 00:22:03,360 --> 00:22:08,310 au executat înainte de bucla condiție a fost reevaluat. 406 00:22:08,310 --> 00:22:11,900 Acum, în acest moment, eu sunt, din nou, la sfârșitul acestui program. 407 00:22:11,900 --> 00:22:15,707 Și eu pot permite acest lucru pentru a trece la permite programul meu pentru a iesi in mod natural. 408 00:22:15,707 --> 00:22:18,290 Dar există o serie de lucruri care sunt importante pentru a ține departe 409 00:22:18,290 --> 00:22:19,960 din această discuție special. 410 00:22:19,960 --> 00:22:22,490 Aveți nevoie pentru a evalua propriile ipoteze 411 00:22:22,490 --> 00:22:24,710 despre modul în care codul ar trebui să fie comporta. 412 00:22:24,710 --> 00:22:28,220 Orice timp credeți că unele bucata de cod știi se întâmplă la locul de muncă, 413 00:22:28,220 --> 00:22:30,940 care ar putea fi un steag rosu pentru a merge înapoi și să evalueze, și asigurați-vă că 414 00:22:30,940 --> 00:22:33,470 că presupunerea ta de cum codul funcționează 415 00:22:33,470 --> 00:22:38,290 este, de fapt adevărat la modul în care este exprimată în codul sursă. 416 00:22:38,290 --> 00:22:41,300 >> Dar chiar mai mult pentru a punct a fost, când suntem folosind debugger, 417 00:22:41,300 --> 00:22:43,920 puteți pune puncte de întrerupere la diferite linii de cod, 418 00:22:43,920 --> 00:22:48,110 ceea ce va determina debugger la pauză execuție la fiecare dintre aceste linii 419 00:22:48,110 --> 00:22:52,210 astfel încât să puteți evalua de memorie sau chiar modifica în loc. 420 00:22:52,210 --> 00:22:55,630 Și din nou, amintiți-vă că puteți creați mai multe puncte de întrerupere, astfel încât să 421 00:22:55,630 --> 00:23:00,390 poate relua, de asemenea, executarea, săriți peste porțiuni mari de cod, 422 00:23:00,390 --> 00:23:04,790 și-l va opri în mod automat la următorul punct de spargere. 423 00:23:04,790 --> 00:23:07,760 >> Există de fapt mai avansat caracteristici ale debugger, precum și. 424 00:23:07,760 --> 00:23:10,170 Dar va trebui să vă referiți la câteva videoclipuri ulterioare 425 00:23:10,170 --> 00:23:14,090 în scopul de a tachineze cu adevărat afară cum de a utiliza aceste funcții speciale. 426 00:23:14,090 --> 00:23:15,990 Pentru moment, vă mulțumesc foarte mult pentru vizionarea. 427 00:23:15,990 --> 00:23:18,080 Și de bună depanare noroc.