1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Dobra GDB. 3 00:00:06,830 --> 00:00:08,480 Co to jest dokładnie? 4 00:00:08,480 --> 00:00:11,310 Więc GDB, który stoi dla GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 jest naprawdę niesamowite narzędzie, które możemy używać, aby pomóc nam debugowania naszych programów, 6 00:00:15,040 --> 00:00:18,210 lub dowiedzieć się, gdzie rzeczy są nie tak w naszych programach. 7 00:00:18,210 --> 00:00:22,590 GDB jest niezwykle silny, ale wyjście i interakcji z nim 8 00:00:22,590 --> 00:00:23,830 może być trochę tajemnicze. 9 00:00:23,830 --> 00:00:28,210 Zazwyczaj linia poleceń narzędzie, a może rzucić dużo wiadomości na ciebie. 10 00:00:28,210 --> 00:00:31,144 A może rodzaj trudno przeanalizować dokładnie, co się dzieje. 11 00:00:31,144 --> 00:00:33,560 Na szczęście, mamy podjąć działania mające na aby rozwiązać ten problem dla Ciebie 12 00:00:33,560 --> 00:00:36,281 jak pracować przez CS50. 13 00:00:36,281 --> 00:00:39,030 Jeśli nie korzystasz z graficznym debugger, które mój kolega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse mówił dość nieco się w filmie, że 15 00:00:41,570 --> 00:00:44,740 powinna być tutaj teraz, może być konieczne 16 00:00:44,740 --> 00:00:48,270 do korzystania z tych linii poleceń Narzędzia do pracy z GDB. 17 00:00:48,270 --> 00:00:51,250 Jeśli pracujesz w CS50 IDE, nie musisz tego robić. 18 00:00:51,250 --> 00:00:53,550 Ale jeśli nie jesteś pracy w CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 być może przy użyciu wersji z CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 lub obsługi kolejny Linux System z GDB zainstalowanego na nim, 21 00:00:58,860 --> 00:01:00,980 może trzeba użyć te narzędzia wiersza poleceń. 22 00:01:00,980 --> 00:01:02,860 >> A ponieważ może musisz zrobić, to 23 00:01:02,860 --> 00:01:06,280 przydatne tylko zrozumieć, jak GDB działa z linii poleceń. 24 00:01:06,280 --> 00:01:09,650 Ale znowu, jeśli jesteś przy użyciu IDE CS50, ty 25 00:01:09,650 --> 00:01:15,400 Można użyć graficznego debuggera który jest wbudowany w IDE. 26 00:01:15,400 --> 00:01:18,750 Tak więc, aby rzeczy się dzieje z GDB, aby rozpocząć debugowanie 27 00:01:18,750 --> 00:01:21,220 Proces szczególna Program, wszystko co musisz zrobić 28 00:01:21,220 --> 00:01:23,810 jest typu GDB następnie pod nazwą programu. 29 00:01:23,810 --> 00:01:28,620 Tak na przykład, jeśli program jest witam, należy wpisać GDB cześć. 30 00:01:28,620 --> 00:01:31,210 >> Gdy to zrobisz, będziesz podciągnąć środowiska GDB. 31 00:01:31,210 --> 00:01:33,800 Twój znak zachęty zmieni, a zamiast tego, co go zwykle 32 00:01:33,800 --> 00:01:35,841 jest w trakcie pisania rzeczy na line-- polecenia ls, 33 00:01:35,841 --> 00:01:38,115 cd-- wszystkie typowy Polecenia Linux swój wiersz 34 00:01:38,115 --> 00:01:42,200 zmieni się, prawdopodobnie, coś jak nawiasach GDB nawiasach. 35 00:01:42,200 --> 00:01:46,630 To jest twój nowy wiersz GDB, ponieważ jesteś wewnątrz środowiska GDB. 36 00:01:46,630 --> 00:01:49,830 Raz wewnątrz tego środowiska, tam dwie główne polecenia 37 00:01:49,830 --> 00:01:52,290 że będziesz prawdopodobnie używać w następującym porządku. 38 00:01:52,290 --> 00:01:55,200 >> Pierwszy z nich to b, które to skrót od przerwy. 39 00:01:55,200 --> 00:01:58,690 A po wpisaniu b, zazwyczaj Wpisz nazwę funkcji, 40 00:01:58,690 --> 00:02:01,040 czy pan wie wokół tego, co linia numer 41 00:02:01,040 --> 00:02:04,100 program zaczyna zachowywać się trochę dziwne, 42 00:02:04,100 --> 00:02:06,370 można wpisać linię Numer również tam. 43 00:02:06,370 --> 00:02:09,660 Co b lub przerwy, nie to pozwala program 44 00:02:09,660 --> 00:02:13,270 biec aż do pewnego punktu, to znaczy, nazwę funkcji 45 00:02:13,270 --> 00:02:15,880 które można określić lub linia podany numer. 46 00:02:15,880 --> 00:02:18,590 >> I w tym momencie to, wstrzyma wykonanie. 47 00:02:18,590 --> 00:02:21,670 Jest to naprawdę dobra rzecz, ponieważ po wykonanie zostało zamrożone, 48 00:02:21,670 --> 00:02:25,214 można zacząć bardzo powoli krok po kroku programu. 49 00:02:25,214 --> 00:02:28,130 Zazwyczaj, jeśli już działa programy, są dość krótkie. 50 00:02:28,130 --> 00:02:31,250 Zazwyczaj należy wpisać kropkę ukośnik co nazwa programu jest, naciśnij Enter, 51 00:02:31,250 --> 00:02:33,470 i zanim można migać, twój Program jest już gotowy. 52 00:02:33,470 --> 00:02:36,620 To naprawdę nie jest dużo czasu, aby spróbować i dowiedzieć się, co się dzieje źle. 53 00:02:36,620 --> 00:02:40,920 Tak naprawdę, aby być w stanie spowolnić rzeczy w dół, ustawiając punkt załamania z b, 54 00:02:40,920 --> 00:02:43,040 a następnie wkracza,. 55 00:02:43,040 --> 00:02:46,169 >> Potem kiedy już ustawić przerwę punkt, można uruchomić program. 56 00:02:46,169 --> 00:02:47,960 A jeśli masz jakiekolwiek Argumenty wiersza poleceń, 57 00:02:47,960 --> 00:02:51,610 określić ich tutaj, a nie kiedy wpisać GDB twoja nazwa programu. 58 00:02:51,610 --> 00:02:55,980 Określić wszystkie wiersza poleceń argumenty biorąc r, lub uruchomienia, 59 00:02:55,980 --> 00:03:00,270 a następnie argumenty wiersza poleceń, co trzeba wewnątrz programu. 60 00:03:00,270 --> 00:03:03,510 Istnieje szereg innych bardzo ważne i przydatne polecenia 61 00:03:03,510 --> 00:03:04,970 wewnątrz środowiska PKB. 62 00:03:04,970 --> 00:03:07,540 Więc niech mi tylko szybko przejść przez niektóre z nich. 63 00:03:07,540 --> 00:03:11,320 >> Pierwszym z nich jest n, który jest krótki, następnie i można wpisać obok zamiast n, 64 00:03:11,320 --> 00:03:12,304 jak będzie działać. 65 00:03:12,304 --> 00:03:13,470 A to tylko skrót. 66 00:03:13,470 --> 00:03:17,540 A jak już zapewne już zdobyć kiedyś, będąc w stanie wpisać rzeczy 67 00:03:17,540 --> 00:03:20,520 krótszy jest ogólnie lepsza. 68 00:03:20,520 --> 00:03:24,100 A co to będzie zrobić, to to będzie Krok do przodu jeden blok kodu. 69 00:03:24,100 --> 00:03:26,170 Więc to będzie iść do przodu do momentu wywołania funkcji. 70 00:03:26,170 --> 00:03:28,350 A następnie zamiast nurkowanie w tej funkcji 71 00:03:28,350 --> 00:03:33,130 i przeżywa wszystko, aby funkcje Kod, to po prostu funkcję. 72 00:03:33,130 --> 00:03:34,400 >> Funkcja zostanie wywołana. 73 00:03:34,400 --> 00:03:35,733 Będzie to robić, co jej praca jest. 74 00:03:35,733 --> 00:03:38,870 Zwróci ona wartość funkcja, która nazywa go. 75 00:03:38,870 --> 00:03:42,490 A potem będziesz przejść do Następna linia tej funkcji wywołującej. 76 00:03:42,490 --> 00:03:44,555 Jeśli chcesz zwiększyć Wewnątrz funkcji 77 00:03:44,555 --> 00:03:46,430 a nie tylko o wykonywał, zwłaszcza 78 00:03:46,430 --> 00:03:50,004 jeśli myślisz, że problem może leżeć wewnątrz tej funkcji, 79 00:03:50,004 --> 00:03:52,670 można oczywiście ustawić przerwę punkt wewnątrz tej funkcji. 80 00:03:52,670 --> 00:03:57,820 Albo, jeśli jesteś już działa, można S by krok naprzód jednej linii kodu. 81 00:03:57,820 --> 00:04:01,170 >> Więc to będzie krok w i nurkowania w funkcji, 82 00:04:01,170 --> 00:04:04,750 zamiast po prostu execute i kontynuuje on w funkcji 83 00:04:04,750 --> 00:04:07,380 że jesteś w debugowania. 84 00:04:07,380 --> 00:04:09,870 Jeśli kiedykolwiek chcesz wiedzieć wartość zmiennej, 85 00:04:09,870 --> 00:04:12,507 można wpisać p lub Drukuj, a następnie nazwę zmiennej. 86 00:04:12,507 --> 00:04:15,090 I że będzie drukować do Ciebie, wewnątrz środowiska GDB, 87 00:04:15,090 --> 00:04:19,110 Nazwa zmiennej, które you-- przepraszam me-- wartość zmiennej 88 00:04:19,110 --> 00:04:20,064 które zostały nazwane. 89 00:04:20,064 --> 00:04:23,230 Jeśli chcesz wiedzieć, wartości każdego zmienna lokalna dostępne z których 90 00:04:23,230 --> 00:04:25,970 które aktualnie są w twoim Program można info Rodzaj mieszkańców. 91 00:04:25,970 --> 00:04:28,332 Jest to o wiele szybciej niż wpisując p, a następnie co, 92 00:04:28,332 --> 00:04:30,540 wymieniając się wszystkie z zmienne, że wiesz, istnieją. 93 00:04:30,540 --> 00:04:34,370 Możesz info Rodzaj mieszkańców, i to wydrukuje wszystko za Ciebie. 94 00:04:34,370 --> 00:04:37,770 Następnie do góry bt, który jest skrót Powrót śladu. 95 00:04:37,770 --> 00:04:41,680 Teraz, na ogół Szczególnie na początku CS50, 96 00:04:41,680 --> 00:04:44,450 nie będzie naprawdę mają okazję używać BT, lub Back śledzenie, 97 00:04:44,450 --> 00:04:47,860 bo nie masz funkcje które nazywają innych funkcji. 98 00:04:47,860 --> 00:04:50,450 >> Możesz mieć główny wezwać Funkcja, ale to chyba nie. 99 00:04:50,450 --> 00:04:53,199 Nie musisz tego innej funkcji wywołanie innej funkcji, która 100 00:04:53,199 --> 00:04:54,880 wywołuje inną funkcję i tak dalej. 101 00:04:54,880 --> 00:04:57,550 Ale jak programy uzyskać więcej złożone, a zwłaszcza 102 00:04:57,550 --> 00:05:00,290 kiedy zaczynasz pracę z rekursji, z powrotem śladu 103 00:05:00,290 --> 00:05:05,150 może być naprawdę przydatny sposób, aby pozwolić ci rodzaj trochę kontekst dla których 104 00:05:05,150 --> 00:05:06,460 Jestem w moim programie. 105 00:05:06,460 --> 00:05:10,590 Więc mówisz, że został napisany kod i wiesz, że głównym wywołuje funkcję 106 00:05:10,590 --> 00:05:14,720 f, która wywołuje funkcję g, który wywołuje funkcję h. 107 00:05:14,720 --> 00:05:17,650 Mamy więc kilka warstw gniazdujących tu dzieje. 108 00:05:17,650 --> 00:05:19,440 >> Jeśli jesteś w środku środowisko GDB, 109 00:05:19,440 --> 00:05:21,640 i znasz swoje wnętrze od godziny, ale można zapomnieć 110 00:05:21,640 --> 00:05:27,210 o tym, co ma cię tam, gdzie Ciebie are-- można wpisać BT, lub z tyłu ślad, 111 00:05:27,210 --> 00:05:32,370 i będzie wydrukować h, g, f głównym, obok innej informacji, która 112 00:05:32,370 --> 00:05:35,984 daje wskazówkę, że OK, głównym nazywa, f, f nazwie g, g nazywa h, 113 00:05:35,984 --> 00:05:37,900 i to, gdzie ja Aktualnie jestem w moim programie. 114 00:05:37,900 --> 00:05:41,380 Więc może to być bardzo przydatne, zwłaszcza, że ​​tajemniczym-ness GDB 115 00:05:41,380 --> 00:05:45,667 staje się nieco przytłaczające, aby dowiedzieć się dokładnie, gdzie rzeczy są. 116 00:05:45,667 --> 00:05:48,500 Wreszcie, gdy program jest zrobione, lub kiedy skończysz debugowania 117 00:05:48,500 --> 00:05:50,125 i chcesz odejść ze środowiska GDB, 118 00:05:50,125 --> 00:05:51,940 warto wiedzieć, jak się z niej wydostać. 119 00:05:51,940 --> 00:05:55,500 Możesz wpisać q lub Zamknij, aby wyjść. 120 00:05:55,500 --> 00:05:59,220 Teraz, przed dzisiejszym wideo Przygotowałem program buggy 121 00:05:59,220 --> 00:06:03,900 nazywa buggy1, które Skompilowałem z pliku zwanym buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Jak można się spodziewać, w tym Program jest w rzeczywistości buggy. 123 00:06:06,500 --> 00:06:08,990 Coś poszło nie tak gdy próbuję i uruchom go. 124 00:06:08,990 --> 00:06:13,014 Teraz, niestety, ja przypadkowo usunąłem plik buggy1.c, 125 00:06:13,014 --> 00:06:15,930 tak, tak mi się dowiedzieć co się dzieje nie tak z tym programem, 126 00:06:15,930 --> 00:06:18,770 Zamierzam użyć GDB rodzaj oślep, próbując 127 00:06:18,770 --> 00:06:22,372 aby poruszać się w tym programie, aby dowiedzieć się, co dokładnie się dzieje źle. 128 00:06:22,372 --> 00:06:24,580 Ale używając tylko narzędzia my już poznali, 129 00:06:24,580 --> 00:06:27,700 możemy prawie figurę się dokładnie, co to jest. 130 00:06:27,700 --> 00:06:30,740 Warto więc udać się do CS50 IDE i przyjrzeć. 131 00:06:30,740 --> 00:06:33,155 OK, więc jesteśmy tutaj, w moim CS50 środowiska IDE, 132 00:06:33,155 --> 00:06:35,697 i będę powiększyć trochę więc można zobaczyć trochę więcej. 133 00:06:35,697 --> 00:06:38,530 W moim oknie terminala, jeśli listy zawartość mojego obecnego dyrektora 134 00:06:38,530 --> 00:06:41,250 z ls, zobaczymy, że ja mają kilka plików źródłowych 135 00:06:41,250 --> 00:06:44,982 Tutaj w tym wcześniej omówione buggy1. 136 00:06:44,982 --> 00:06:46,940 Co dokładnie dzieje się, gdy Staram się uruchomić buggy1. 137 00:06:46,940 --> 00:06:47,773 Dobrze niech się dowiedzieć. 138 00:06:47,773 --> 00:06:52,510 I typu dot slash, buggy, i naciśnij Enter. 139 00:06:52,510 --> 00:06:53,670 >> Błędy segmentacji. 140 00:06:53,670 --> 00:06:55,000 To niedobrze. 141 00:06:55,000 --> 00:06:57,180 Jeśli przypomnisz, to Usterka segmentacji zazwyczaj 142 00:06:57,180 --> 00:07:01,540 pojawia się, gdy mamy dostęp do pamięci że nie wolno dotykać. 143 00:07:01,540 --> 00:07:03,820 Musimy w jakiś sposób osiągnięta poza granicami 144 00:07:03,820 --> 00:07:05,995 tego, co programu, Kompilator, nam dał. 145 00:07:05,995 --> 00:07:08,310 I tak już to jest kluczem do utrzymania w przyborniku 146 00:07:08,310 --> 00:07:10,660 jak rozpocząć proces debugowania. 147 00:07:10,660 --> 00:07:13,620 Coś poszło trochę źle tutaj. 148 00:07:13,620 --> 00:07:15,935 >> W porządku, więc zacznijmy się środowiska GDB 149 00:07:15,935 --> 00:07:19,030 i zobaczyć, czy możemy dowiedzieć się, co dokładnie jest problem. 150 00:07:19,030 --> 00:07:21,674 Zamierzam wyczyścić ekran, i mam zamiar wpisać GDB 151 00:07:21,674 --> 00:07:24,340 ponownie, aby wejść do środowiska GDB, i nazwa programu 152 00:07:24,340 --> 00:07:27,450 że chcę do debugowania, buggy1. 153 00:07:27,450 --> 00:07:30,182 Mamy trochę wiadomości, czytanie symbole z buggy1, zrobić. 154 00:07:30,182 --> 00:07:32,390 Wszystko to oznacza, że ​​jest pociągnął razem cały kod, 155 00:07:32,390 --> 00:07:35,570 a teraz, że został załadowany do GDB i jest gotowy do pracy. 156 00:07:35,570 --> 00:07:37,140 >> Teraz to, co chcę zrobić? 157 00:07:37,140 --> 00:07:39,130 Pamiętasz, co się Pierwszym krokiem jest zazwyczaj 158 00:07:39,130 --> 00:07:42,540 po jestem wewnątrz tego środowiska? 159 00:07:42,540 --> 00:07:44,540 Mam nadzieję, że wspomniany zestaw punkt załamania, ponieważ 160 00:07:44,540 --> 00:07:46,240 w tym, że jest to, co chcę zrobić. 161 00:07:46,240 --> 00:07:47,990 Teraz nie mam Kod źródłowy tego 162 00:07:47,990 --> 00:07:50,948 przede mną, co jest prawdopodobnie nie typowy przypadek użycia, tak przy okazji. 163 00:07:50,948 --> 00:07:52,055 Prawdopodobnie będzie. 164 00:07:52,055 --> 00:07:52,680 Więc to jest dobre. 165 00:07:52,680 --> 00:07:55,790 Ale zakładając, że nie, co jest jedna funkcja, że ​​wiesz 166 00:07:55,790 --> 00:07:58,880 istnieje w każdym programie C? 167 00:07:58,880 --> 00:08:04,420 Nie ważne jak duże lub jak skomplikowane to ta funkcja pewnością istnieje. 168 00:08:04,420 --> 00:08:05,440 Głównym, prawda? 169 00:08:05,440 --> 00:08:08,870 >> Tak więc w przypadku braku wszystkim, możemy ustawić punkt przerwania w głównym. 170 00:08:08,870 --> 00:08:12,200 I znowu, może po prostu wpisać złamać głównym, zamiast b. 171 00:08:12,200 --> 00:08:14,650 A jeśli jesteś ciekawy, jeśli Ciebie kiedykolwiek wpisać się długą polecenia 172 00:08:14,650 --> 00:08:16,800 a następnie uświadomić sobie, że ciebie wpisane coś złego, 173 00:08:16,800 --> 00:08:18,770 i chcesz się pozbyć wszystkim, jak właśnie to zrobiłem, 174 00:08:18,770 --> 00:08:22,029 Czy można przejąć kontrolę U, który będzie usunąć wszystko i przyprowadzę was z powrotem 175 00:08:22,029 --> 00:08:23,570 na początku linii kursora. 176 00:08:23,570 --> 00:08:26,569 Dużo szybciej niż po prostu przytrzymaj usunąć lub ukryć, że do czasu grono 177 00:08:26,569 --> 00:08:27,080 ponad. 178 00:08:27,080 --> 00:08:28,740 >> Będziemy więc ustawić punkt przerwania w głównym. 179 00:08:28,740 --> 00:08:32,970 I jak widać, to mówi, mamy ustawić punkt przerwania w pliku buggy1.c, 180 00:08:32,970 --> 00:08:36,330 i najwyraźniej pierwsza linia z kodem głównym jest linia siedem. 181 00:08:36,330 --> 00:08:38,080 Ponownie, nie mamy plik źródłowy tutaj, 182 00:08:38,080 --> 00:08:40,429 ale będę zakładać, że jest to mówi mi prawdę. 183 00:08:40,429 --> 00:08:44,510 A potem, po prostu próbuję i uruchomić program, r. 184 00:08:44,510 --> 00:08:45,360 Uruchamianie programu. 185 00:08:45,360 --> 00:08:48,160 W porządku, więc ta wiadomość jest trochę tajemniczy. 186 00:08:48,160 --> 00:08:50,160 Ale w zasadzie to, co jest dzieje się tutaj, jest to po prostu 187 00:08:50,160 --> 00:08:53,350 mówi mi, ja uderzyłem przerwę punkt, numer punktu 1 przerwa. 188 00:08:53,350 --> 00:08:55,877 >> A potem, że linia kodu, Brak pliku lub katalogu. 189 00:08:55,877 --> 00:08:57,710 Jedynym powodem, dla którego Widzę, że wiadomość 190 00:08:57,710 --> 00:09:00,800 to dlatego, że przypadkowo usunąłem buggy.c plik. 191 00:09:00,800 --> 00:09:04,050 Jeśli istniała moja buggy1.c pliku w bieżącym katalogu, 192 00:09:04,050 --> 00:09:06,920 prawo to linia nie będzie w rzeczywistości powiedz mi, co linia kodu 193 00:09:06,920 --> 00:09:08,214 dosłownie czyta. 194 00:09:08,214 --> 00:09:09,380 Niestety, ona usunięta. 195 00:09:09,380 --> 00:09:14,790 My będziemy mieć do rodzaju nawigacja przez to trochę bardziej na oślep. 196 00:09:14,790 --> 00:09:17,330 >> OK, więc zobaczymy, co chcę tu zrobić? 197 00:09:17,330 --> 00:09:21,770 Cóż, chciałbym wiedzieć, co lokalne Dostępne są zmienne może do mnie. 198 00:09:21,770 --> 00:09:23,570 Zacząłem mój program. 199 00:09:23,570 --> 00:09:28,515 Zobaczmy, co może być już zainicjowany dla nas. 200 00:09:28,515 --> 00:09:31,430 I typ informacji mieszkańców, nie mieszkańców. 201 00:09:31,430 --> 00:09:33,960 W porządku, tak aby nie dają mi mnóstwo informacji. 202 00:09:33,960 --> 00:09:37,600 Mógłbym spróbować wydrukować zmienną, ale nie znam żadnych nazw zmiennych. 203 00:09:37,600 --> 00:09:39,930 Mógłbym spróbować prześledzić wstecz, ale jestem wewnątrz główne, 204 00:09:39,930 --> 00:09:43,710 tak, wiem, że nie dokonały teraz inne połączenie funkcji. 205 00:09:43,710 --> 00:09:47,710 >> Tak wygląda moje jedyne opcje używać n lub tak i zacząć nurkować. 206 00:09:47,710 --> 00:09:49,630 Mam zamiar używać n. 207 00:09:49,630 --> 00:09:51,180 Więc typu n. 208 00:09:51,180 --> 00:09:53,060 O mój Boże, co tu się dzieje. 209 00:09:53,060 --> 00:09:56,260 Program otrzymał sygnały, SIGSEGV winy segmentacji, 210 00:09:56,260 --> 00:09:57,880 a następnie cała masa rzeczy. 211 00:09:57,880 --> 00:09:58,880 Jestem już przytłoczeni. 212 00:09:58,880 --> 00:10:00,980 Cóż, jest w rzeczywistości wiele nauczyć tutaj. 213 00:10:00,980 --> 00:10:02,520 Więc co nam to mówi? 214 00:10:02,520 --> 00:10:09,180 Co mówi nam to, ten program jest o, ale jeszcze nie, seg winy. 215 00:10:09,180 --> 00:10:12,550 A w szczególności, zamierzam aby powiększyć jeszcze bardziej tutaj, 216 00:10:12,550 --> 00:10:18,980 to o do SEG usterkę o coś, co nazywa strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Teraz możemy nie omawialiśmy Funkcja ta w znacznym stopniu. 218 00:10:22,705 --> 00:10:25,580 Ale to jest--, ponieważ nie będziemy rozmawiać o każdej funkcji, które 219 00:10:25,580 --> 00:10:28,610 istnieje w standardzie C library-- ale wszystkie są dostępne dla Ciebie, 220 00:10:28,610 --> 00:10:32,110 szczególnie, jeśli wziąć spojrzeć na reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 I strcmp jest naprawdę potężny Funkcja, która istnieje wewnątrz 222 00:10:35,000 --> 00:10:38,070 z string.h nagłówka Plik, który stanowi nagłówek 223 00:10:38,070 --> 00:10:41,970 Plik, który jest dedykowany do funkcji że praca i manipulowanie sznurki. 224 00:10:41,970 --> 00:10:49,830 >> A w szczególności, co strcmp robi to porównuje wartości dwóch łańcuchów. 225 00:10:49,830 --> 00:10:54,160 Więc jestem o segmentacji winy na wezwanie do strcmp wydaje. 226 00:10:54,160 --> 00:10:58,530 I hit n, w rzeczywistości pojawia się komunikat, Program zakończony SIGSEGV sygnału 227 00:10:58,530 --> 00:11:01,370 Usterka segmentacji. Więc teraz I rzeczywiście nie seg nic zarzucić, 228 00:11:01,370 --> 00:11:06,479 i mój program ma dość bardzo efektywnie wydane. 229 00:11:06,479 --> 00:11:07,770 Jest to koniec programu. 230 00:11:07,770 --> 00:11:10,370 To się zepsuł, rozbił się. 231 00:11:10,370 --> 00:11:14,740 Tak więc nie było dużo, ale faktycznie nauczyć się trochę 232 00:11:14,740 --> 00:11:16,747 z tego małego doświadczenia. 233 00:11:16,747 --> 00:11:17,580 Co ja nauczyłem? 234 00:11:17,580 --> 00:11:22,020 Cóż, mój program wywala prawie natychmiast. 235 00:11:22,020 --> 00:11:26,300 Mój program zawiesza się na wezwanie do strcmp, ale 236 00:11:26,300 --> 00:11:30,560 nie mają żadnych zmiennych lokalnych w moim Program w tym czasie, że wywala. 237 00:11:30,560 --> 00:11:37,320 Więc co łańcuch lub łańcuchy, mógłbym być porównanie. 238 00:11:37,320 --> 00:11:42,140 Jeśli nie ma żadnych lokalnych zmienne, to polubisz 239 00:11:42,140 --> 00:11:45,520 przypuszczać, że nie może mi have-- jest zmienna globalna, która może być prawda. 240 00:11:45,520 --> 00:11:47,670 >> Ale ogólnie, to wydaje jakbym porównanie 241 00:11:47,670 --> 00:11:52,070 do czegoś, co nie istnieje. 242 00:11:52,070 --> 00:11:54,130 Warto więc zbadać że trochę dalej. 243 00:11:54,130 --> 00:11:55,120 Więc mam zamiar oczyścić ekran. 244 00:11:55,120 --> 00:11:57,536 Mam zamiar rzucić się z Środowisko GDB na sekundę. 245 00:11:57,536 --> 00:12:01,300 I myślę, OK, więc nie ma zmienne lokalne w moim programie. 246 00:12:01,300 --> 00:12:06,444 Zastanawiam się, czy może mam do przekazania w ciągu znaków jako argument wiersza poleceń. 247 00:12:06,444 --> 00:12:07,610 Więc po prostu przetestować to. 248 00:12:07,610 --> 00:12:09,020 Nie zrobiłem tego wcześniej. 249 00:12:09,020 --> 00:12:14,244 >> Zobaczymy, czy może gdybym uruchomić ten program z argumentem wiersza poleceń działa. 250 00:12:14,244 --> 00:12:16,140 Huh, nie z winy nie segmentacji. 251 00:12:16,140 --> 00:12:17,870 To po prostu powiedział mi, że zdobione. 252 00:12:17,870 --> 00:12:19,170 Więc może to jest poprawka tutaj. 253 00:12:19,170 --> 00:12:27,560 I rzeczywiście, jeśli wrócę i spojrzeć na rzeczywisty kod źródłowy buggy1.c, 254 00:12:27,560 --> 00:12:31,180 wydaje się, że to, co robię jest Robię wezwanie do strcmp bez 255 00:12:31,180 --> 00:12:34,010 sprawdzania, czy rzeczywiście argv [1] nie istnieje. 256 00:12:34,010 --> 00:12:36,730 To jest rzeczywiście Kod źródłowy buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Więc to, co naprawdę trzeba tu zrobić, aby naprawić mój program, 258 00:12:38,855 --> 00:12:40,835 zakładając, że mam złożyć przed sobą, jest 259 00:12:40,835 --> 00:12:44,740 po prostu dodać sprawdź, pewność, że argc jest równe 2. 260 00:12:44,740 --> 00:12:47,780 Więc ten przykład, znowu, jak powiedziałem, jest trochę wymyślony, prawda? 261 00:12:47,780 --> 00:12:49,840 Nie jesteś ogólnie będzie przypadkowo usunąć kod źródłowy 262 00:12:49,840 --> 00:12:51,820 a następnie spróbować oraz debugowanie programu. 263 00:12:51,820 --> 00:12:53,120 Ale miejmy nadzieję, że dał Ci ilustracja 264 00:12:53,120 --> 00:12:55,120 z rodzajów rzeczy, które można myśleć o 265 00:12:55,120 --> 00:12:56,610 jak jesteś debugowania programu. 266 00:12:56,610 --> 00:12:58,760 >> Jaki jest stan rzeczy tutaj? 267 00:12:58,760 --> 00:13:00,510 Jakie zmienne zrobić I mają dostęp do mnie? 268 00:13:00,510 --> 00:13:03,600 Gdzie dokładnie jest mój program upaść, na jakiej linii, 269 00:13:03,600 --> 00:13:05,240 na to, co wezwanie do jakiej funkcji? 270 00:13:05,240 --> 00:13:06,952 Jakie wskazówki, czy to mi dać? 271 00:13:06,952 --> 00:13:08,910 I to jest dokładnie rodzaj myślenia, który Cię 272 00:13:08,910 --> 00:13:12,820 należy dostać się, gdy jesteś myśląc o debugowania programów. 273 00:13:12,820 --> 00:13:13,820 >> Jestem Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 To CS50. 275 00:13:16,140 --> 00:15:08,642