DOUG LLOYD: Dobra GDB. Co to jest dokładnie? Więc GDB, który stoi dla GNU Debugger, jest naprawdę niesamowite narzędzie, które możemy używać, aby pomóc nam debugowania naszych programów, lub dowiedzieć się, gdzie rzeczy są nie tak w naszych programach. GDB jest niezwykle silny, ale wyjście i interakcji z nim może być trochę tajemnicze. Zazwyczaj linia poleceń narzędzie, a może rzucić dużo wiadomości na ciebie. A może rodzaj trudno przeanalizować dokładnie, co się dzieje. Na szczęście, mamy podjąć działania mające na aby rozwiązać ten problem dla Ciebie jak pracować przez CS50. Jeśli nie korzystasz z graficznym debugger, które mój kolega Dan Armandarse mówił dość nieco się w filmie, że powinna być tutaj teraz, może być konieczne do korzystania z tych linii poleceń Narzędzia do pracy z GDB. Jeśli pracujesz w CS50 IDE, nie musisz tego robić. Ale jeśli nie jesteś pracy w CS50 IDE, być może przy użyciu wersji z CS50 Appliance, lub obsługi kolejny Linux System z GDB zainstalowanego na nim, może trzeba użyć te narzędzia wiersza poleceń. A ponieważ może musisz zrobić, to przydatne tylko zrozumieć, jak GDB działa z linii poleceń. Ale znowu, jeśli jesteś przy użyciu IDE CS50, ty Można użyć graficznego debuggera który jest wbudowany w IDE. Tak więc, aby rzeczy się dzieje z GDB, aby rozpocząć debugowanie Proces szczególna Program, wszystko co musisz zrobić jest typu GDB następnie pod nazwą programu. Tak na przykład, jeśli program jest witam, należy wpisać GDB cześć. Gdy to zrobisz, będziesz podciągnąć środowiska GDB. Twój znak zachęty zmieni, a zamiast tego, co go zwykle jest w trakcie pisania rzeczy na line-- polecenia ls, cd-- wszystkie typowy Polecenia Linux swój wiersz zmieni się, prawdopodobnie, coś jak nawiasach GDB nawiasach. To jest twój nowy wiersz GDB, ponieważ jesteś wewnątrz środowiska GDB. Raz wewnątrz tego środowiska, tam dwie główne polecenia że będziesz prawdopodobnie używać w następującym porządku. Pierwszy z nich to b, które to skrót od przerwy. A po wpisaniu b, zazwyczaj Wpisz nazwę funkcji, czy pan wie wokół tego, co linia numer program zaczyna zachowywać się trochę dziwne, można wpisać linię Numer również tam. Co b lub przerwy, nie to pozwala program biec aż do pewnego punktu, to znaczy, nazwę funkcji które można określić lub linia podany numer. I w tym momencie to, wstrzyma wykonanie. Jest to naprawdę dobra rzecz, ponieważ po wykonanie zostało zamrożone, można zacząć bardzo powoli krok po kroku programu. Zazwyczaj, jeśli już działa programy, są dość krótkie. Zazwyczaj należy wpisać kropkę ukośnik co nazwa programu jest, naciśnij Enter, i zanim można migać, twój Program jest już gotowy. To naprawdę nie jest dużo czasu, aby spróbować i dowiedzieć się, co się dzieje źle. Tak naprawdę, aby być w stanie spowolnić rzeczy w dół, ustawiając punkt załamania z b, a następnie wkracza,. Potem kiedy już ustawić przerwę punkt, można uruchomić program. A jeśli masz jakiekolwiek Argumenty wiersza poleceń, określić ich tutaj, a nie kiedy wpisać GDB twoja nazwa programu. Określić wszystkie wiersza poleceń argumenty biorąc r, lub uruchomienia, a następnie argumenty wiersza poleceń, co trzeba wewnątrz programu. Istnieje szereg innych bardzo ważne i przydatne polecenia wewnątrz środowiska PKB. Więc niech mi tylko szybko przejść przez niektóre z nich. Pierwszym z nich jest n, który jest krótki, następnie i można wpisać obok zamiast n, jak będzie działać. A to tylko skrót. A jak już zapewne już zdobyć kiedyś, będąc w stanie wpisać rzeczy krótszy jest ogólnie lepsza. A co to będzie zrobić, to to będzie Krok do przodu jeden blok kodu. Więc to będzie iść do przodu do momentu wywołania funkcji. A następnie zamiast nurkowanie w tej funkcji i przeżywa wszystko, aby funkcje Kod, to po prostu funkcję. Funkcja zostanie wywołana. Będzie to robić, co jej praca jest. Zwróci ona wartość funkcja, która nazywa go. A potem będziesz przejść do Następna linia tej funkcji wywołującej. Jeśli chcesz zwiększyć Wewnątrz funkcji a nie tylko o wykonywał, zwłaszcza jeśli myślisz, że problem może leżeć wewnątrz tej funkcji, można oczywiście ustawić przerwę punkt wewnątrz tej funkcji. Albo, jeśli jesteś już działa, można S by krok naprzód jednej linii kodu. Więc to będzie krok w i nurkowania w funkcji, zamiast po prostu execute i kontynuuje on w funkcji że jesteś w debugowania. Jeśli kiedykolwiek chcesz wiedzieć wartość zmiennej, można wpisać p lub Drukuj, a następnie nazwę zmiennej. I że będzie drukować do Ciebie, wewnątrz środowiska GDB, Nazwa zmiennej, które you-- przepraszam me-- wartość zmiennej które zostały nazwane. Jeśli chcesz wiedzieć, wartości każdego zmienna lokalna dostępne z których które aktualnie są w twoim Program można info Rodzaj mieszkańców. Jest to o wiele szybciej niż wpisując p, a następnie co, wymieniając się wszystkie z zmienne, że wiesz, istnieją. Możesz info Rodzaj mieszkańców, i to wydrukuje wszystko za Ciebie. Następnie do góry bt, który jest skrót Powrót śladu. Teraz, na ogół Szczególnie na początku CS50, nie będzie naprawdę mają okazję używać BT, lub Back śledzenie, bo nie masz funkcje które nazywają innych funkcji. Możesz mieć główny wezwać Funkcja, ale to chyba nie. Nie musisz tego innej funkcji wywołanie innej funkcji, która wywołuje inną funkcję i tak dalej. Ale jak programy uzyskać więcej złożone, a zwłaszcza kiedy zaczynasz pracę z rekursji, z powrotem śladu może być naprawdę przydatny sposób, aby pozwolić ci rodzaj trochę kontekst dla których Jestem w moim programie. Więc mówisz, że został napisany kod i wiesz, że głównym wywołuje funkcję f, która wywołuje funkcję g, który wywołuje funkcję h. Mamy więc kilka warstw gniazdujących tu dzieje. Jeśli jesteś w środku środowisko GDB, i znasz swoje wnętrze od godziny, ale można zapomnieć o tym, co ma cię tam, gdzie Ciebie are-- można wpisać BT, lub z tyłu ślad, i będzie wydrukować h, g, f głównym, obok innej informacji, która daje wskazówkę, że OK, głównym nazywa, f, f nazwie g, g nazywa h, i to, gdzie ja Aktualnie jestem w moim programie. Więc może to być bardzo przydatne, zwłaszcza, że ​​tajemniczym-ness GDB staje się nieco przytłaczające, aby dowiedzieć się dokładnie, gdzie rzeczy są. Wreszcie, gdy program jest zrobione, lub kiedy skończysz debugowania i chcesz odejść ze środowiska GDB, warto wiedzieć, jak się z niej wydostać. Możesz wpisać q lub Zamknij, aby wyjść. Teraz, przed dzisiejszym wideo Przygotowałem program buggy nazywa buggy1, które Skompilowałem z pliku zwanym buggy1.c. Jak można się spodziewać, w tym Program jest w rzeczywistości buggy. Coś poszło nie tak gdy próbuję i uruchom go. Teraz, niestety, ja przypadkowo usunąłem plik buggy1.c, tak, tak mi się dowiedzieć co się dzieje nie tak z tym programem, Zamierzam użyć GDB rodzaj oślep, próbując aby poruszać się w tym programie, aby dowiedzieć się, co dokładnie się dzieje źle. Ale używając tylko narzędzia my już poznali, możemy prawie figurę się dokładnie, co to jest. Warto więc udać się do CS50 IDE i przyjrzeć. OK, więc jesteśmy tutaj, w moim CS50 środowiska IDE, i będę powiększyć trochę więc można zobaczyć trochę więcej. W moim oknie terminala, jeśli listy zawartość mojego obecnego dyrektora z ls, zobaczymy, że ja mają kilka plików źródłowych Tutaj w tym wcześniej omówione buggy1. Co dokładnie dzieje się, gdy Staram się uruchomić buggy1. Dobrze niech się dowiedzieć. I typu dot slash, buggy, i naciśnij Enter. Błędy segmentacji. To niedobrze. Jeśli przypomnisz, to Usterka segmentacji zazwyczaj pojawia się, gdy mamy dostęp do pamięci że nie wolno dotykać. Musimy w jakiś sposób osiągnięta poza granicami tego, co programu, Kompilator, nam dał. I tak już to jest kluczem do utrzymania w przyborniku jak rozpocząć proces debugowania. Coś poszło trochę źle tutaj. W porządku, więc zacznijmy się środowiska GDB i zobaczyć, czy możemy dowiedzieć się, co dokładnie jest problem. Zamierzam wyczyścić ekran, i mam zamiar wpisać GDB ponownie, aby wejść do środowiska GDB, i nazwa programu że chcę do debugowania, buggy1. Mamy trochę wiadomości, czytanie symbole z buggy1, zrobić. Wszystko to oznacza, że ​​jest pociągnął razem cały kod, a teraz, że został załadowany do GDB i jest gotowy do pracy. Teraz to, co chcę zrobić? Pamiętasz, co się Pierwszym krokiem jest zazwyczaj po jestem wewnątrz tego środowiska? Mam nadzieję, że wspomniany zestaw punkt załamania, ponieważ w tym, że jest to, co chcę zrobić. Teraz nie mam Kod źródłowy tego przede mną, co jest prawdopodobnie nie typowy przypadek użycia, tak przy okazji. Prawdopodobnie będzie. Więc to jest dobre. Ale zakładając, że nie, co jest jedna funkcja, że ​​wiesz istnieje w każdym programie C? Nie ważne jak duże lub jak skomplikowane to ta funkcja pewnością istnieje. Głównym, prawda? Tak więc w przypadku braku wszystkim, możemy ustawić punkt przerwania w głównym. I znowu, może po prostu wpisać złamać głównym, zamiast b. A jeśli jesteś ciekawy, jeśli Ciebie kiedykolwiek wpisać się długą polecenia a następnie uświadomić sobie, że ciebie wpisane coś złego, i chcesz się pozbyć wszystkim, jak właśnie to zrobiłem, Czy można przejąć kontrolę U, który będzie usunąć wszystko i przyprowadzę was z powrotem na początku linii kursora. Dużo szybciej niż po prostu przytrzymaj usunąć lub ukryć, że do czasu grono ponad. Będziemy więc ustawić punkt przerwania w głównym. I jak widać, to mówi, mamy ustawić punkt przerwania w pliku buggy1.c, i najwyraźniej pierwsza linia z kodem głównym jest linia siedem. Ponownie, nie mamy plik źródłowy tutaj, ale będę zakładać, że jest to mówi mi prawdę. A potem, po prostu próbuję i uruchomić program, r. Uruchamianie programu. W porządku, więc ta wiadomość jest trochę tajemniczy. Ale w zasadzie to, co jest dzieje się tutaj, jest to po prostu mówi mi, ja uderzyłem przerwę punkt, numer punktu 1 przerwa. A potem, że linia kodu, Brak pliku lub katalogu. Jedynym powodem, dla którego Widzę, że wiadomość to dlatego, że przypadkowo usunąłem buggy.c plik. Jeśli istniała moja buggy1.c pliku w bieżącym katalogu, prawo to linia nie będzie w rzeczywistości powiedz mi, co linia kodu dosłownie czyta. Niestety, ona usunięta. My będziemy mieć do rodzaju nawigacja przez to trochę bardziej na oślep. OK, więc zobaczymy, co chcę tu zrobić? Cóż, chciałbym wiedzieć, co lokalne Dostępne są zmienne może do mnie. Zacząłem mój program. Zobaczmy, co może być już zainicjowany dla nas. I typ informacji mieszkańców, nie mieszkańców. W porządku, tak aby nie dają mi mnóstwo informacji. Mógłbym spróbować wydrukować zmienną, ale nie znam żadnych nazw zmiennych. Mógłbym spróbować prześledzić wstecz, ale jestem wewnątrz główne, tak, wiem, że nie dokonały teraz inne połączenie funkcji. Tak wygląda moje jedyne opcje używać n lub tak i zacząć nurkować. Mam zamiar używać n. Więc typu n. O mój Boże, co tu się dzieje. Program otrzymał sygnały, SIGSEGV winy segmentacji, a następnie cała masa rzeczy. Jestem już przytłoczeni. Cóż, jest w rzeczywistości wiele nauczyć tutaj. Więc co nam to mówi? Co mówi nam to, ten program jest o, ale jeszcze nie, seg winy. A w szczególności, zamierzam aby powiększyć jeszcze bardziej tutaj, to o do SEG usterkę o coś, co nazywa strcmp. Teraz możemy nie omawialiśmy Funkcja ta w znacznym stopniu. Ale to jest--, ponieważ nie będziemy rozmawiać o każdej funkcji, które istnieje w standardzie C library-- ale wszystkie są dostępne dla Ciebie, szczególnie, jeśli wziąć spojrzeć na reference.cs50.net. I strcmp jest naprawdę potężny Funkcja, która istnieje wewnątrz z string.h nagłówka Plik, który stanowi nagłówek Plik, który jest dedykowany do funkcji że praca i manipulowanie sznurki. A w szczególności, co strcmp robi to porównuje wartości dwóch łańcuchów. Więc jestem o segmentacji winy na wezwanie do strcmp wydaje. I hit n, w rzeczywistości pojawia się komunikat, Program zakończony SIGSEGV sygnału Usterka segmentacji. Więc teraz I rzeczywiście nie seg nic zarzucić, i mój program ma dość bardzo efektywnie wydane. Jest to koniec programu. To się zepsuł, rozbił się. Tak więc nie było dużo, ale faktycznie nauczyć się trochę z tego małego doświadczenia. Co ja nauczyłem? Cóż, mój program wywala prawie natychmiast. Mój program zawiesza się na wezwanie do strcmp, ale nie mają żadnych zmiennych lokalnych w moim Program w tym czasie, że wywala. Więc co łańcuch lub łańcuchy, mógłbym być porównanie. Jeśli nie ma żadnych lokalnych zmienne, to polubisz przypuszczać, że nie może mi have-- jest zmienna globalna, która może być prawda. Ale ogólnie, to wydaje jakbym porównanie do czegoś, co nie istnieje. Warto więc zbadać że trochę dalej. Więc mam zamiar oczyścić ekran. Mam zamiar rzucić się z Środowisko GDB na sekundę. I myślę, OK, więc nie ma zmienne lokalne w moim programie. Zastanawiam się, czy może mam do przekazania w ciągu znaków jako argument wiersza poleceń. Więc po prostu przetestować to. Nie zrobiłem tego wcześniej. Zobaczymy, czy może gdybym uruchomić ten program z argumentem wiersza poleceń działa. Huh, nie z winy nie segmentacji. To po prostu powiedział mi, że zdobione. Więc może to jest poprawka tutaj. I rzeczywiście, jeśli wrócę i spojrzeć na rzeczywisty kod źródłowy buggy1.c, wydaje się, że to, co robię jest Robię wezwanie do strcmp bez sprawdzania, czy rzeczywiście argv [1] nie istnieje. To jest rzeczywiście Kod źródłowy buggy1.c. Więc to, co naprawdę trzeba tu zrobić, aby naprawić mój program, zakładając, że mam złożyć przed sobą, jest po prostu dodać sprawdź, pewność, że argc jest równe 2. Więc ten przykład, znowu, jak powiedziałem, jest trochę wymyślony, prawda? Nie jesteś ogólnie będzie przypadkowo usunąć kod źródłowy a następnie spróbować oraz debugowanie programu. Ale miejmy nadzieję, że dał Ci ilustracja z rodzajów rzeczy, które można myśleć o jak jesteś debugowania programu. Jaki jest stan rzeczy tutaj? Jakie zmienne zrobić I mają dostęp do mnie? Gdzie dokładnie jest mój program upaść, na jakiej linii, na to, co wezwanie do jakiej funkcji? Jakie wskazówki, czy to mi dać? I to jest dokładnie rodzaj myślenia, który Cię należy dostać się, gdy jesteś myśląc o debugowania programów. Jestem Doug Lloyd. To CS50.