1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG Lloyd: Hyvä GDB. 3 00:00:06,830 --> 00:00:08,480 Mikä on se tarkalleen? 4 00:00:08,480 --> 00:00:11,310 Joten GDB, joka seisoo GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 on todella mahtava työkalu, voimme joka auttaa meitä debug meidän ohjelmia, 6 00:00:15,040 --> 00:00:18,210 tai selville, missä asiat ovat vialla meidän ohjelmia. 7 00:00:18,210 --> 00:00:22,590 GDB on hämmästyttävän tehokas, mutta lähtö ja vuorovaikutus sen kanssa 8 00:00:22,590 --> 00:00:23,830 voi olla hieman arvoituksellinen. 9 00:00:23,830 --> 00:00:28,210 Se on yleensä komentorivityökalu, ja se voi heittää paljon viestejä sinua. 10 00:00:28,210 --> 00:00:31,144 Ja se voi eräänlainen vaikea jäsentää, mitä on tekeillä. 11 00:00:31,144 --> 00:00:33,560 Onneksi olemme ryhtyneet toimiin korjata tämän ongelman puolestasi 12 00:00:33,560 --> 00:00:36,281 kuten työn kautta CS50. 13 00:00:36,281 --> 00:00:39,030 Jos et käytä graafista debuggeri, joka kollegani Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse on puhunut varsin hieman noin vuonna videon 15 00:00:41,570 --> 00:00:44,740 pitäisi olla täällä juuri nyt, saatat tarvita 16 00:00:44,740 --> 00:00:48,270 käyttää näitä komentoriviltä työkalut työskennellä GDB. 17 00:00:48,270 --> 00:00:51,250 Jos olet työskennellyt CS50 IDE, sinun ei tarvitse tehdä tätä. 18 00:00:51,250 --> 00:00:53,550 Mutta jos et ole työskentelevät CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 ehkä käyttäen versio ja CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 tai toinen Linux järjestelmä GDB asennettu sille, 21 00:00:58,860 --> 00:01:00,980 saatat joutua käyttämään nämä komentorivityökaluja. 22 00:01:00,980 --> 00:01:02,860 >> Ja koska saatat on tehtävä se, se on 23 00:01:02,860 --> 00:01:06,280 hyödyllinen vain ymmärtää, miten GDB toimii komentoriviltä. 24 00:01:06,280 --> 00:01:09,650 Mutta jälleen kerran, jos olet käyttämällä CS50 IDE, sinua 25 00:01:09,650 --> 00:01:15,400 voidaan käyttää graafisia debuggeri joka on rakennettu IDE. 26 00:01:15,400 --> 00:01:18,750 Joten saada asiat menossa GDB, aloittaa debuggaus 27 00:01:18,750 --> 00:01:21,220 menetelmä tietyn ohjelma, sinun ei tarvitse tehdä 28 00:01:21,220 --> 00:01:23,810 on tyyppi GDB seuraa ohjelman nimen. 29 00:01:23,810 --> 00:01:28,620 Niinpä esimerkiksi, jos ohjelma on Hei, kirjoitetaan GDB hei. 30 00:01:28,620 --> 00:01:31,210 >> Kun teet näin, olet menossa vetää ylös GDB ympäristö. 31 00:01:31,210 --> 00:01:33,800 Nopeasta muuttuu, ja sen sijaan, että mitä se yleensä 32 00:01:33,800 --> 00:01:35,841 on kun kirjoitat asiat käskyn line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- kaikki tyypillinen Linux komennot, nopeasta 34 00:01:38,115 --> 00:01:42,200 muuttuu, luultavasti, jotain kuten suluissa GDB suluissa. 35 00:01:42,200 --> 00:01:46,630 Se on uusi GDB nopea, koska olet sisällä GDB ympäristöön. 36 00:01:46,630 --> 00:01:49,830 Kun sisällä että ympäristön, siellä on kaksi suurta komentoja 37 00:01:49,830 --> 00:01:52,290 että olet luultavasti käyttää seuraavassa järjestyksessä. 38 00:01:52,290 --> 00:01:55,200 >> Ensimmäinen on b, joka on lyhyt tauko. 39 00:01:55,200 --> 00:01:58,690 Ja kun kirjoitat b, normaalisti kirjoita nimi toiminto, 40 00:01:58,690 --> 00:02:01,040 tai jos satut tietää noin mitä rivinumero 41 00:02:01,040 --> 00:02:04,100 ohjelma alkaa käyttäytyä hieman outo, 42 00:02:04,100 --> 00:02:06,370 voit kirjoittaa linja numero siellä. 43 00:02:06,370 --> 00:02:09,660 Mitä b, tai tauko, tekee on se mahdollistaa ohjelman 44 00:02:09,660 --> 00:02:13,270 ajaa asti tiettyyn pisteeseen, nimittäin, funktion nimi 45 00:02:13,270 --> 00:02:15,880 että olet määrittänyt tai linja määritettyyn numeroon. 46 00:02:15,880 --> 00:02:18,590 >> Ja siinä vaiheessa, se jäädyttää suoritus. 47 00:02:18,590 --> 00:02:21,670 Tämä on todella hyvä asia, koska kun suoritus on jäädytetty, 48 00:02:21,670 --> 00:02:25,214 voit alkaa hyvin hitaasti vaiheittain ohjelman. 49 00:02:25,214 --> 00:02:28,130 Yleensä, jos olet ollut käynnissä ohjelmat, ne ovat melko lyhyitä. 50 00:02:28,130 --> 00:02:31,250 Yleensä kirjoitat piste slash riippumatta nimi ohjelman, paina Enter, 51 00:02:31,250 --> 00:02:33,470 ja ennen kuin voit vilkkua, teidän ohjelma on jo päättynyt. 52 00:02:33,470 --> 00:02:36,620 Se ei oikeastaan ​​paljon aikaa kokeilla ja selvittää, mitä on vialla. 53 00:02:36,620 --> 00:02:40,920 Niin se todella pystyä hidastaa asioita alas asettamalla taitekohta b, 54 00:02:40,920 --> 00:02:43,040 ja sitten tehostamalla. 55 00:02:43,040 --> 00:02:46,169 >> Sitten kun olet määrittänyt tauko kohta, voit suorittaa ohjelman. 56 00:02:46,169 --> 00:02:47,960 Ja jos sinulla on komentoriviargumentteja, 57 00:02:47,960 --> 00:02:51,610 voit määrittää ne tänne, ei kun kirjoitat GDB ohjelman nimi. 58 00:02:51,610 --> 00:02:55,980 Voit määrittää kaikki komentoriviltä perustelut ottamalla r, tai ajaa, 59 00:02:55,980 --> 00:03:00,270 ja sitten mitä komentoriviargumentteja tarvitset sisällä oman ohjelman. 60 00:03:00,270 --> 00:03:03,510 On olemassa useita muita todella tärkeitä ja hyödyllisiä komentoja 61 00:03:03,510 --> 00:03:04,970 sisällä BKT ympäristön. 62 00:03:04,970 --> 00:03:07,540 Joten haluan vain nopeasti mennä yli joitakin niistä. 63 00:03:07,540 --> 00:03:11,320 >> Ensimmäinen on n, joka on lyhyt ensi, ja voit kirjoittaa seuraavan sijasta n, 64 00:03:11,320 --> 00:03:12,304 molemmat toimisi. 65 00:03:12,304 --> 00:03:13,470 Ja se on vain pika. 66 00:03:13,470 --> 00:03:17,540 Ja kun olet luultavasti jo saanut käytetään, että voimme kirjoittaa asioita 67 00:03:17,540 --> 00:03:20,520 lyhyempi on yleensä parempi. 68 00:03:20,520 --> 00:03:24,100 Ja mitä se tekee on se tulee siirtyä eteenpäin yhden korttelin koodia. 69 00:03:24,100 --> 00:03:26,170 Joten se tulee edetä kunnes funktiokutsu. 70 00:03:26,170 --> 00:03:28,350 Ja sitten sen sijaan, sukeltamalla että toiminto 71 00:03:28,350 --> 00:03:33,130 ja käy läpi kaikki kyseisen toiminnot koodi, se vain on toiminto. 72 00:03:33,130 --> 00:03:34,400 >> Toiminto kutsutaan. 73 00:03:34,400 --> 00:03:35,733 Se tekee mitä sen työ on. 74 00:03:35,733 --> 00:03:38,870 Se palaa arvon toiminto, joka kutsui sitä. 75 00:03:38,870 --> 00:03:42,490 Ja sitten sinun siirtyä seuraavan rivin että kutsuvan toiminto. 76 00:03:42,490 --> 00:03:44,555 Jos haluat astua sisällä funktion, 77 00:03:44,555 --> 00:03:46,430 eikä vain ottaa se toteuttaa, erityisesti 78 00:03:46,430 --> 00:03:50,004 jos luulet, että ongelma saattaa olla sisällä että toiminta, 79 00:03:50,004 --> 00:03:52,670 voit tietysti asettaa tauko kohta sisällä tätä toiminnallisuutta. 80 00:03:52,670 --> 00:03:57,820 Tai jos olet jo käynnissä, voit käyttää s siirtyä eteenpäin yhden rivin koodia. 81 00:03:57,820 --> 00:04:01,170 >> Joten tämä askel ja sukeltaa toiminnot, 82 00:04:01,170 --> 00:04:04,750 sijasta vain suorittaa ja jatketaan vuonna toiminto 83 00:04:04,750 --> 00:04:07,380 että olet virheenjäljitykseen. 84 00:04:07,380 --> 00:04:09,870 Jos joskus haluat tietää muuttujanarvoon, 85 00:04:09,870 --> 00:04:12,507 voit kirjoittaa p, tai Tulosta, ja sitten muuttujan nimi. 86 00:04:12,507 --> 00:04:15,090 Ja joka tulostaa sinulle, sisällä GDB ympäristön, 87 00:04:15,090 --> 00:04:19,110 muuttujan nimi, että sinä-- vapauta me-- muuttujan arvo 88 00:04:19,110 --> 00:04:20,064 että olet nimetty. 89 00:04:20,064 --> 00:04:23,230 Jos haluat tietää arvot jokaisen paikallinen muuttuja pääsee missä 90 00:04:23,230 --> 00:04:25,970 tällä hetkellä ovat sinun ohjelma, voit kirjoittaa tiedot paikallisia. 91 00:04:25,970 --> 00:04:28,332 Se on paljon nopeampi kuin kirjoittamalla p ja sitten mitä tahansa, 92 00:04:28,332 --> 00:04:30,540 luetellaan pois kaikki muuttujat, että tiedät olemassa. 93 00:04:30,540 --> 00:04:34,370 Voit kirjoittaa tiedot paikalliset, ja se tulostaa kaiken puolestasi. 94 00:04:34,370 --> 00:04:37,770 Seuraavaksi on BT, joka on lyhyt Back Trace. 95 00:04:37,770 --> 00:04:41,680 Nyt yleisesti, etenkin alussa CS50, 96 00:04:41,680 --> 00:04:44,450 sinun ei todellakaan ole tilaisuus käyttää bt, tai Back Trace, 97 00:04:44,450 --> 00:04:47,860 koska et ottaa toimintoja että soittaa muita toimintoja. 98 00:04:47,860 --> 00:04:50,450 >> Saatat olla tärkein puhelu toiminto, mutta se on luultavasti se. 99 00:04:50,450 --> 00:04:53,199 Sinulla ei ole, että muu toiminto kutsuvan toinen toiminto, joka 100 00:04:53,199 --> 00:04:54,880 kehottaa toisen toiminnon, ja niin edelleen. 101 00:04:54,880 --> 00:04:57,550 Mutta ohjelmia saada enemmän monimutkainen, ja erityisesti 102 00:04:57,550 --> 00:05:00,290 kun töiden aloittamista rekursiivisia, takaisin jäljittää 103 00:05:00,290 --> 00:05:05,150 voi olla todella hyödyllinen tapa antaa sinulle Tällainen saada kontekstin, jossa 104 00:05:05,150 --> 00:05:06,460 Olen minun ohjelma. 105 00:05:06,460 --> 00:05:10,590 Sano olet kirjoittanut koodin, ja te tiedätte, että tärkein kutsuu funktiota 106 00:05:10,590 --> 00:05:14,720 f, joka kutsuu funktiota g, joka kutsuu funktiota h. 107 00:05:14,720 --> 00:05:17,650 Joten meillä on useita kerroksia Pesivien täällä. 108 00:05:17,650 --> 00:05:19,440 >> Jos olet sisällä sinun GDB ympäristö, 109 00:05:19,440 --> 00:05:21,640 ja tiedät sisällä h, mutta unohdat 110 00:05:21,640 --> 00:05:27,210 mitä sai sinut minne are-- voit kirjoittaa bt, tai takaisin jäljittää, 111 00:05:27,210 --> 00:05:32,370 ja se tulostaa h, g, f tärkein, rinnalla joitakin muita tietoja, jotka 112 00:05:32,370 --> 00:05:35,984 antaa sinulle vihjeen, että OK tärkein kutsutaan f, f kutsutaan g, g nimeltään h, 113 00:05:35,984 --> 00:05:37,900 ja siitähän minä Tällä hetkellä olen minun ohjelma. 114 00:05:37,900 --> 00:05:41,380 Joten se voi olla todella hyödyllinen, varsinkin kun arvoituksellinen-toisuutta GDB 115 00:05:41,380 --> 00:05:45,667 on hieman ylivoimainen, jotta selvittää tarkasti, missä asiat ovat. 116 00:05:45,667 --> 00:05:48,500 Lopuksi, kun ohjelma on tehty, tai kun olet valmis debuggaamista 117 00:05:48,500 --> 00:05:50,125 ja haluat astua pois alkaen GDB ympäristö, 118 00:05:50,125 --> 00:05:51,940 se auttaa tietää, miten päästä pois siitä. 119 00:05:51,940 --> 00:05:55,500 Voit kirjoittaa q, tai Lopeta, ulos. 120 00:05:55,500 --> 00:05:59,220 Nyt, ennen tämänpäiväistä video Olen valmis buginen ohjelma 121 00:05:59,220 --> 00:06:03,900 nimeltään buggy1, joka kokosin tiedostosta tunnetaan buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Kuten arvata saattaa, tämä ohjelma on itse asiassa buginen. 123 00:06:06,500 --> 00:06:08,990 Jotain menee pieleen kun yritän ja käyttää sitä. 124 00:06:08,990 --> 00:06:13,014 Nyt valitettavasti olen epähuomiossa Poistin buggy1.c tiedoston, 125 00:06:13,014 --> 00:06:15,930 joten jotta minun selvittää mikä on vialla tämän ohjelman, 126 00:06:15,930 --> 00:06:18,770 Aion on käytettävä GDB sellainen sokeasti, yrittää 127 00:06:18,770 --> 00:06:22,372 Voit selata ohjelman selvittää, mitä on vialla. 128 00:06:22,372 --> 00:06:24,580 Mutta käyttäen vain työkaluja olemme jo oppineet, 129 00:06:24,580 --> 00:06:27,700 voimme melko paljon kuva tarkalleen, mitä se on. 130 00:06:27,700 --> 00:06:30,740 Joten pään yli CS50 IDE ja katsoa. 131 00:06:30,740 --> 00:06:33,155 OK, joten olemme täällä minun CS50 IDE ympäristö, 132 00:06:33,155 --> 00:06:35,697 ja minä zoomata hieman joten voit nähdä hieman enemmän. 133 00:06:35,697 --> 00:06:38,530 Minun pääteikkuna, jos I luettelo sisältö minun nykyinen johtaja 134 00:06:38,530 --> 00:06:41,250 LS, näemme, että minä on pari lähdetiedostot 135 00:06:41,250 --> 00:06:44,982 tässä, mukaan lukien aiemmin keskusteltu buggy1. 136 00:06:44,982 --> 00:06:46,940 Mitä menee kun Yritän ja ajaa buggy1. 137 00:06:46,940 --> 00:06:47,773 No katsotaanpa selvittää. 138 00:06:47,773 --> 00:06:52,510 Kirjoitan piste slash, buginen, ja osuin Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentointi viat. 140 00:06:53,670 --> 00:06:55,000 Tuo ei ole hyvä. 141 00:06:55,000 --> 00:06:57,180 Jos muistatte, segmentointi vika tyypillisesti 142 00:06:57,180 --> 00:07:01,540 tapahtuu, kun pääsemme muisti että emme saa koskea. 143 00:07:01,540 --> 00:07:03,820 Olemme jotenkin saavuttaneet ulkopuolella rajojen 144 00:07:03,820 --> 00:07:05,995 mitä ohjelman, kääntäjä, on antanut meille. 145 00:07:05,995 --> 00:07:08,310 Ja niin jo se vihje pitää työkalupakin 146 00:07:08,310 --> 00:07:10,660 kun aloitamme virheenkorjaus prosessi. 147 00:07:10,660 --> 00:07:13,620 Jotain on mennyt pieleen täällä. 148 00:07:13,620 --> 00:07:15,935 >> Selvä, joten aloitetaan ylös GDB ympäristö 149 00:07:15,935 --> 00:07:19,030 ja katso jos voimme selvittää mitä ongelma on. 150 00:07:19,030 --> 00:07:21,674 Aion tyhjentää näytön, ja aion kirjoittaa GDB 151 00:07:21,674 --> 00:07:24,340 uudelleen, syöttää GDB ympäristöön, ja ohjelman nimi 152 00:07:24,340 --> 00:07:27,450 että haluan vianjäljitykseen, buggy1. 153 00:07:27,450 --> 00:07:30,182 Saamme pienen viestin, lukeminen symboleja buggy1, tehty. 154 00:07:30,182 --> 00:07:32,390 Kaikki tämä tarkoittaa, on se veti yhteen kaikki koodi, 155 00:07:32,390 --> 00:07:35,570 ja nyt se on ladattu GDB, ja se on valmis menemään. 156 00:07:35,570 --> 00:07:37,140 >> Nyt, mitä haluan tehdä? 157 00:07:37,140 --> 00:07:39,130 Muistatteko mitä Ensimmäinen askel on tyypillisesti 158 00:07:39,130 --> 00:07:42,540 kun olen sisällä tässä ympäristössä? 159 00:07:42,540 --> 00:07:44,540 Toivottavasti mainittu joukko taitekohta, koska 160 00:07:44,540 --> 00:07:46,240 itse asiassa, että on mitä haluan tehdä. 161 00:07:46,240 --> 00:07:47,990 Nyt minulla ei ole lähdekoodi tästä 162 00:07:47,990 --> 00:07:50,948 edessäni, joka on luultavasti ei tyypillinen use case, muuten. 163 00:07:50,948 --> 00:07:52,055 Luultavasti. 164 00:07:52,055 --> 00:07:52,680 Niin se on hyvä. 165 00:07:52,680 --> 00:07:55,790 Mutta olettaen et, mitä yksi toiminto, tiedät 166 00:07:55,790 --> 00:07:58,880 olemassa jokaisessa C-ohjelma? 167 00:07:58,880 --> 00:08:04,420 Ei ole väliä kuinka suuri tai kuinka monimutkainen se on, tämä toiminto on varmasti olemassa. 168 00:08:04,420 --> 00:08:05,440 Main, eikö? 169 00:08:05,440 --> 00:08:08,870 >> Joten ei ole kaikkea, voimme asettaa taitekohta tärkeimmissä. 170 00:08:08,870 --> 00:08:12,200 Ja vielä, voisin vain tyyppi rikkoa tärkein sijasta b. 171 00:08:12,200 --> 00:08:14,650 Ja jos olet kiinnostunut, jos koskaan kirjoittamiseen pitkä komento 172 00:08:14,650 --> 00:08:16,800 ja sitten ymmärtää, että olet kirjoittanut väärää, 173 00:08:16,800 --> 00:08:18,770 ja haluat päästä eroon kaikki kuten juuri tein, 174 00:08:18,770 --> 00:08:22,029 voit hallita U, joka poistaa kaiken ja tuo sinut takaisin 175 00:08:22,029 --> 00:08:23,570 alkuun kohdistinviivat. 176 00:08:23,570 --> 00:08:26,569 Paljon nopeammin kuin vain pitämällä poistaa, tai lyömällä se joukko kertaa 177 00:08:26,569 --> 00:08:27,080 yli. 178 00:08:27,080 --> 00:08:28,740 >> Joten me asettaa taitekohta tärkeimmissä. 179 00:08:28,740 --> 00:08:32,970 Ja kuten näette, se sanoo olemme asettaa taitekohta on tiedosto buggy1.c, 180 00:08:32,970 --> 00:08:36,330 ja ilmeisesti ensimmäinen rivi koodi tärkeimmistä on line seitsemän. 181 00:08:36,330 --> 00:08:38,080 Jälleen meillä ei ole lähdetiedosto täällä, 182 00:08:38,080 --> 00:08:40,429 mutta minä olettaa, että se on kertoo minulle totuuden. 183 00:08:40,429 --> 00:08:44,510 Ja sitten, yritän vain ja suorita ohjelma, r. 184 00:08:44,510 --> 00:08:45,360 Alkaen ohjelma. 185 00:08:45,360 --> 00:08:48,160 Selvä, niin tämä viesti on hieman arvoituksellinen. 186 00:08:48,160 --> 00:08:50,160 Mutta pohjimmiltaan mitä tapahtuu tässä se on vain 187 00:08:50,160 --> 00:08:53,350 kertoo minulle Olen löi tauko kohta, taitekohta numero 1. 188 00:08:53,350 --> 00:08:55,877 >> Ja sitten, että rivi koodia, Ei tällaista tiedostoa tai hakemistoa. 189 00:08:55,877 --> 00:08:57,710 Ainoa syy, että Näen, että viesti 190 00:08:57,710 --> 00:09:00,800 on koska olen vahingossa Poistin buggy.c tiedosto. 191 00:09:00,800 --> 00:09:04,050 Jos minun buggy1.c tiedosto olemassa nykyisen hakemiston, 192 00:09:04,050 --> 00:09:06,920 että linja tuolla todella kerro mitä koodiriviä 193 00:09:06,920 --> 00:09:08,214 kirjaimellisesti lukee. 194 00:09:08,214 --> 00:09:09,380 Valitettavasti olen poistanut sen. 195 00:09:09,380 --> 00:09:14,790 Aiomme olla sellaista navigoida kautta tämä hieman sokeasti. 196 00:09:14,790 --> 00:09:17,330 >> OK, joten katsotaanpa, mitä minä haluan tehdä täällä? 197 00:09:17,330 --> 00:09:21,770 No, haluaisin tietää mitä paikallisia muuttujat ehkä minulla on käytössäni. 198 00:09:21,770 --> 00:09:23,570 Olen alkanut minun ohjelma. 199 00:09:23,570 --> 00:09:28,515 Katsotaan, mitä voisi olla jo alustettu meille. 200 00:09:28,515 --> 00:09:31,430 Kirjoitan Info paikalliset, ei paikallisia. 201 00:09:31,430 --> 00:09:33,960 Hyvä, jotta ei antaa minulle ton tiedon. 202 00:09:33,960 --> 00:09:37,600 Voisin yrittää tulostaa muuttuja, mutta en tiedä mitään muuttujien nimet. 203 00:09:37,600 --> 00:09:39,930 Voisin yrittää takaisin jälki, mutta olen sisällä tärkein, 204 00:09:39,930 --> 00:09:43,710 joten tiedän En ole tehnyt toinen toiminto soittaa juuri nyt. 205 00:09:43,710 --> 00:09:47,710 >> Joten näyttää minun ainoat vaihtoehdot ovat käyttää n tai niin ja alkaa sukeltaa. 206 00:09:47,710 --> 00:09:49,630 Aion käyttää n. 207 00:09:49,630 --> 00:09:51,180 Joten kirjoitan n. 208 00:09:51,180 --> 00:09:53,060 Jestas, mitä täällä tapahtuu. 209 00:09:53,060 --> 00:09:56,260 Ohjelma vastaanotetut signaalit, SIGSEGV segmentointi vika, 210 00:09:56,260 --> 00:09:57,880 ja sitten koko joukko tavaraa. 211 00:09:57,880 --> 00:09:58,880 Olen jo ylityöllistettyjä. 212 00:09:58,880 --> 00:10:00,980 No, on oikeastaan paljon opittavaa täällä. 213 00:10:00,980 --> 00:10:02,520 Mitä tämä kertoo meille? 214 00:10:02,520 --> 00:10:09,180 Mitä se kertoo meille on, tämä ohjelma on noin, mutta ei ole vielä, seg vika. 215 00:10:09,180 --> 00:10:12,550 Ja erityisesti, aion zoomata entisestään täällä, 216 00:10:12,550 --> 00:10:18,980 se on noin Seg vika noin jotain kutsutaan strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nyt, emme ehkä keskustelleet tämä toiminto laajasti. 218 00:10:22,705 --> 00:10:25,580 Mutta se is-- koska emme aio puhua jokainen toiminto 219 00:10:25,580 --> 00:10:28,610 olemassa C standardin library-- mutta ne ovat kaikki käytettävissä, 220 00:10:28,610 --> 00:10:32,110 varsinkin jos otat katsokaa reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Ja strcmp on todella voimakas toiminto, joka on olemassa sisällä 222 00:10:35,000 --> 00:10:38,070 on string.h otsikon tiedosto, joka on header 223 00:10:38,070 --> 00:10:41,970 tiedoston, joka on omistettu toimintoja että työn ja manipuloida jouset. 224 00:10:41,970 --> 00:10:49,830 >> Ja erityisesti, mitä strcmp tekee on se vertaa arvoja kaksi merkkijonoa. 225 00:10:49,830 --> 00:10:54,160 Joten olen aikeissa segmentointi vika päälle puhelun strcmp se näyttää. 226 00:10:54,160 --> 00:10:58,530 Osuin n, ja itse asiassa saan viestin, Ohjelma päättyi signaalin SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentointi vika. Joten nyt Olen itse seg vialliseksi, 228 00:11:01,370 --> 00:11:06,479 ja minun ohjelma on melko paljon tehokkaasti luopunut. 229 00:11:06,479 --> 00:11:07,770 Tämä on ohjelman lopussa. 230 00:11:07,770 --> 00:11:10,370 Se hajosi, se kaatui. 231 00:11:10,370 --> 00:11:14,740 Joten ei ollut paljon, mutta olen itse asiassa opin melkoisesti 232 00:11:14,740 --> 00:11:16,747 tästä vähän kokemusta. 233 00:11:16,747 --> 00:11:17,580 Mitä olen oppinut? 234 00:11:17,580 --> 00:11:22,020 No, minun ohjelma kaatuu melko paljon heti. 235 00:11:22,020 --> 00:11:26,300 Minun ohjelma kaatuu soittaa strcmp, mutta minä 236 00:11:26,300 --> 00:11:30,560 ei ole paikallisia muuttujia minun ohjelma tuolloin, että se kaatuu. 237 00:11:30,560 --> 00:11:37,320 Joten mitä string, tai jouset, voisin olla vertaamalla. 238 00:11:37,320 --> 00:11:42,140 Jos minulla ei ole mitään paikallista muuttujat, saatat 239 00:11:42,140 --> 00:11:45,520 otaksua, että minä have-- siellä ehkä on globaali muuttuja, joka voisi olla totta. 240 00:11:45,520 --> 00:11:47,670 >> Mutta yleisesti, se näyttää kuten olen vertaamalla 241 00:11:47,670 --> 00:11:52,070 jotain jota ei ole olemassa. 242 00:11:52,070 --> 00:11:54,130 Joten tutkia että hieman pidemmälle. 243 00:11:54,130 --> 00:11:55,120 Joten aion tyhjentää näytön. 244 00:11:55,120 --> 00:11:57,536 Aion lopettaa ulos GDB ympäristö toista. 245 00:11:57,536 --> 00:12:01,300 Ja olen ajatellut, OK, joten ei ei paikallisia muuttujia minun ohjelma. 246 00:12:01,300 --> 00:12:06,444 Ihmettelen, jos ehkä minun pitäisi välittää merkkijono kuin komentorivillä. 247 00:12:06,444 --> 00:12:07,610 Joten vain testata tätä ulos. 248 00:12:07,610 --> 00:12:09,020 En ole tehnyt tätä ennen. 249 00:12:09,020 --> 00:12:14,244 >> Katsotaanpa, jos ehkä, jos en suorita tämä ohjelma jossa komentorivillä se toimii. 250 00:12:14,244 --> 00:12:16,140 Huh, ei segmentointi vika siellä. 251 00:12:16,140 --> 00:12:17,870 Se kertoi minulle juuri, että olen tajunnut sitä. 252 00:12:17,870 --> 00:12:19,170 Joten ehkä se on korjata täällä. 253 00:12:19,170 --> 00:12:27,560 Ja todellakin, jos menen takaisin ja katsoa todellinen lähdekoodi buggy1.c, 254 00:12:27,560 --> 00:12:31,180 näyttää siltä, ​​että mitä teen on Teen puhelun strcmp ilman 255 00:12:31,180 --> 00:12:34,010 tarkistetaan, onko itse asiassa argv [1] on olemassa. 256 00:12:34,010 --> 00:12:36,730 Tämä on oikeastaan lähdekoodi buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Joten mitä todella tarvitsee tehdä tästä vahvistaa minun ohjelma, 258 00:12:38,855 --> 00:12:40,835 olettaen Minulla tiedosto edessäni, on 259 00:12:40,835 --> 00:12:44,740 vain lisätä tarkista, Varmista, että argc on yhtä suuri kuin 2. 260 00:12:44,740 --> 00:12:47,780 Joten tässä esimerkissä taas, kuten sanoin, on hieman keinotekoinen, eikö? 261 00:12:47,780 --> 00:12:49,840 Et yleensä aio vahingossa poistaa lähdekoodi 262 00:12:49,840 --> 00:12:51,820 ja sitten täytyy yrittää ja debug ohjelman. 263 00:12:51,820 --> 00:12:53,120 Mutta toivottavasti se antoi sinua kuva 264 00:12:53,120 --> 00:12:55,120 siitä, millaisia ​​asioita, jotka voisit ajatella 265 00:12:55,120 --> 00:12:56,610 kun olet virheenkorjaus ohjelman. 266 00:12:56,610 --> 00:12:58,760 >> Mikä tilanne täällä? 267 00:12:58,760 --> 00:13:00,510 Mitä muuttujia minun on saatavilla minulle? 268 00:13:00,510 --> 00:13:03,600 Missä tarkalleen on minun ohjelma kaatuu, mitä linja, 269 00:13:03,600 --> 00:13:05,240 mitä puhelun mitä toimintoa? 270 00:13:05,240 --> 00:13:06,952 Millaisia ​​johtolankoja ei, jotka antavat minulle? 271 00:13:06,952 --> 00:13:08,910 Ja juuri Tällainen ajattelutapa, että te 272 00:13:08,910 --> 00:13:12,820 olisi päästä, kun olet ajatellut virheenkorjaus ohjelmat. 273 00:13:12,820 --> 00:13:13,820 >> Olen Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Tämä on CS50. 275 00:13:16,140 --> 00:15:08,642