1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Alle Rechte GDB. 3 00:00:06,830 --> 00:00:08,480 Was ist das genau? 4 00:00:08,480 --> 00:00:11,310 So GDB, der steht für den GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 ist ein wirklich genial Werkzeug, das wir können nutzen, um uns zu helfen, unsere Programme zu debuggen, 6 00:00:15,040 --> 00:00:18,210 oder herausfinden, wo die Dinge sind falsch in unseren Programmen. 7 00:00:18,210 --> 00:00:22,590 GDB ist unglaublich mächtig, aber der Ausgang und die Interaktion mit ihm 8 00:00:22,590 --> 00:00:23,830 kann ein wenig kryptisch sein. 9 00:00:23,830 --> 00:00:28,210 Es ist in der Regel ein Kommandozeilen-Tool, und es kann eine Menge von Nachrichten auf dich werfen. 10 00:00:28,210 --> 00:00:31,144 Und es kann ziemlich schwer zu analysieren genau, was los ist. 11 00:00:31,144 --> 00:00:33,560 Glücklicherweise haben wir genommen haben Schritte , dieses Problem für Sie zu beheben 12 00:00:33,560 --> 00:00:36,281 wie Sie arbeiten durch CS50. 13 00:00:36,281 --> 00:00:39,030 Wenn Sie nicht über die grafische Debugger, die mein Kollege Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse hat recht gesprochen ein wenig über in ein Video, 15 00:00:41,570 --> 00:00:44,740 sollte hier sein, gerade jetzt, die Sie benötigen 16 00:00:44,740 --> 00:00:48,270 um diese Befehlszeile verwenden Werkzeuge, um mit GDB zu arbeiten. 17 00:00:48,270 --> 00:00:51,250 Wenn Sie in der CS50 Arbeits IDE, brauchen Sie nicht, dies zu tun. 18 00:00:51,250 --> 00:00:53,550 Aber wenn Sie nicht Arbeiten in der CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 vielleicht eine Version der CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 oder eine andere Linux-Betriebs System mit GDB installiert ist, 21 00:00:58,860 --> 00:01:00,980 Sie benötigen, um zu verwenden Diese Kommandozeilen-Tools. 22 00:01:00,980 --> 00:01:02,860 >> Und da Sie vielleicht haben, das zu tun, es ist 23 00:01:02,860 --> 00:01:06,280 nützlich, nur zu verstehen, wie GDB funktioniert über die Befehlszeile. 24 00:01:06,280 --> 00:01:09,650 Aber noch einmal, wenn Sie mit dem CS50-IDE, Sie 25 00:01:09,650 --> 00:01:15,400 können die grafischen Debugger verwenden dass in den IDE gebaut. 26 00:01:15,400 --> 00:01:18,750 Also um Dinge geht mit GDB, um das Debugging zu starten 27 00:01:18,750 --> 00:01:21,220 Verfahren nach einem bestimmten Programm, alles, was Sie tun müssen, 28 00:01:21,220 --> 00:01:23,810 ist Typ GDB gefolgt nach dem Programmnamen. 29 00:01:23,810 --> 00:01:28,620 So zum Beispiel, wenn Ihr Programm hallo, würden Sie GDB hallo geben. 30 00:01:28,620 --> 00:01:31,210 >> Wenn du das tust, wirst du zu ziehen Sie die GDB Umwelt. 31 00:01:31,210 --> 00:01:33,800 Prompt wird sich ändern, und statt, was es normalerweise 32 00:01:33,800 --> 00:01:35,841 ist, wenn man die Dinge geben an den Befehl ls line--, 33 00:01:35,841 --> 00:01:38,115 cd-- alle Ihre typischen Linux-Befehle, Ihre prompte 34 00:01:38,115 --> 00:01:42,200 wird, wahrscheinlich, etwas zu ändern wie Klammern GDB Klammern. 35 00:01:42,200 --> 00:01:46,630 Das ist Ihr neues GDB Aufforderung, weil Sie innerhalb der GDB-Umgebung sind. 36 00:01:46,630 --> 00:01:49,830 Einmal in dieser Umgebung, es gibt zwei wichtige Befehle 37 00:01:49,830 --> 00:01:52,290 dass Sie wahrscheinlich verwenden in dieser Reihenfolge. 38 00:01:52,290 --> 00:01:55,200 >> Die erste ist B, die ist die Abkürzung für Pause. 39 00:01:55,200 --> 00:01:58,690 Und nachdem Sie Typ B, Sie in der Regel Geben Sie den Namen einer Funktion, 40 00:01:58,690 --> 00:02:01,040 oder wenn Sie weiß zufällig, um das, was Zeilennummer 41 00:02:01,040 --> 00:02:04,100 Ihr Programm wird gestartet verhalten ein wenig seltsam, 42 00:02:04,100 --> 00:02:06,370 Sie eine Zeile eingeben können Nummer auch dort. 43 00:02:06,370 --> 00:02:09,660 Was für b oder Pause tut ist es erlaubt Ihrem Programm 44 00:02:09,660 --> 00:02:13,270 In den Hochlauf bis zu einem bestimmten Punkt, nämlich den Namen der Funktion, 45 00:02:13,270 --> 00:02:15,880 dass Sie angeben, oder die Leitung Zahl, die Sie angeben. 46 00:02:15,880 --> 00:02:18,590 >> Und an diesem Punkt ist es, wird die Ausführung einzufrieren. 47 00:02:18,590 --> 00:02:21,670 Dies ist eine wirklich gute Sache, denn einmal die Ausführung eingefroren wurde, 48 00:02:21,670 --> 00:02:25,214 Sie können sehr langsam beginnen Schritt für Schritt durch das Programm. 49 00:02:25,214 --> 00:02:28,130 In der Regel, wenn Sie waren läuft Ihre Programme, sie sind ziemlich kurz. 50 00:02:28,130 --> 00:02:31,250 Normalerweise dot Schrägstrich geben Sie unabhängig der Name des Programms, drücken Sie die Eingabetaste, 51 00:02:31,250 --> 00:02:33,470 und bevor Sie blinken kann, Ihrem Programm bereits beendet. 52 00:02:33,470 --> 00:02:36,620 Es ist nicht wirklich viel Zeit, um zu versuchen und herauszufinden, was falsch läuft. 53 00:02:36,620 --> 00:02:40,920 So dass es wirklich in der Lage, die Dinge zu verlangsamen nach unten, indem Sie einen Haltepunkt mit b, 54 00:02:40,920 --> 00:02:43,040 und dann verstärkt in. 55 00:02:43,040 --> 00:02:46,169 >> Dann, wenn Sie Ihre Pause festgelegt haben Nun können Sie das Programm auszuführen. 56 00:02:46,169 --> 00:02:47,960 Und wenn Sie welche haben Befehlszeilenargumente, 57 00:02:47,960 --> 00:02:51,610 Sie sie hier angeben, nicht, wenn Sie tippen GDB Ihren Programmnamen. 58 00:02:51,610 --> 00:02:55,980 Sie legen fest, alle in der Befehlszeile Argumente, indem r, oder laufen, 59 00:02:55,980 --> 00:03:00,270 und dann unabhängig von Befehlszeilenargumente Sie brauchen innerhalb Ihres Programms. 60 00:03:00,270 --> 00:03:03,510 Es gibt eine Anzahl von anderen wirklich wichtige und nützliche Befehle 61 00:03:03,510 --> 00:03:04,970 Innere des BIP Umwelt. 62 00:03:04,970 --> 00:03:07,540 Also lassen Sie mich nur schnell gehen Sie über einige von ihnen. 63 00:03:07,540 --> 00:03:11,320 >> Die erste n ist, die Kurzform für nächsten ist, und man kann weiter anstelle von n-Typ, 64 00:03:11,320 --> 00:03:12,304 beide funktionieren würde. 65 00:03:12,304 --> 00:03:13,470 Und es ist nur die Kurzform. 66 00:03:13,470 --> 00:03:17,540 Und wie Sie wahrscheinlich schon bekommen um, in der Lage, Dinge zu geben verwendet 67 00:03:17,540 --> 00:03:20,520 kürzer ist im allgemeinen besser. 68 00:03:20,520 --> 00:03:24,100 Und was sie tun werden, ist, es wird Schritt nach vorn einen Code-Block. 69 00:03:24,100 --> 00:03:26,170 So dass es dann vorwärts zu bewegen bis zu einem Funktionsaufruf. 70 00:03:26,170 --> 00:03:28,350 Und dann statt Tauchen in dieser Funktion 71 00:03:28,350 --> 00:03:33,130 und gehen durch alle dieser Funktionen Code, wird es nur die Funktion haben. 72 00:03:33,130 --> 00:03:34,400 >> Die Funktion wird aufgerufen. 73 00:03:34,400 --> 00:03:35,733 Es wird alles tun, was ihre Arbeit ist. 74 00:03:35,733 --> 00:03:38,870 Es wird ein Wert zurück die Funktion, die sie aufruft. 75 00:03:38,870 --> 00:03:42,490 Und dann wirst du gehen Sie zum nächste Zeile dieser aufrufenden Funktion. 76 00:03:42,490 --> 00:03:44,555 Wenn Sie mit Schritt wollen innerhalb der Funktion, 77 00:03:44,555 --> 00:03:46,430 statt nur mit sie auszuführen, vor allem 78 00:03:46,430 --> 00:03:50,004 wenn Sie denken, dass das Problem könnte innerhalb dieser Funktion liegen, 79 00:03:50,004 --> 00:03:52,670 Sie könnten natürlich, setzen Sie eine Pause Punkt innerhalb dieser Funktion. 80 00:03:52,670 --> 00:03:57,820 Oder wenn Sie bereits ausgeführt sind, können Sie benutzen s nach vorne eine Zeile Code zu treten. 81 00:03:57,820 --> 00:04:01,170 >> So wird dies in Schritt und tauchen Sie in Funktionen, 82 00:04:01,170 --> 00:04:04,750 anstatt einfach nur die Ausführungs und Weiterbildung von in der Funktion 83 00:04:04,750 --> 00:04:07,380 dass Sie in der Fehlersuche. 84 00:04:07,380 --> 00:04:09,870 Wenn Sie überhaupt wissen wollen der Wert einer Variablen, 85 00:04:09,870 --> 00:04:12,507 Sie tippen können p oder drucken, und dann der Variablenname. 86 00:04:12,507 --> 00:04:15,090 Und das wird sich um Sie zu drucken, Innenseite der GDB Umgebung 87 00:04:15,090 --> 00:04:19,110 der Name der Variable, dass Sie-- entschuldigen Sie mich- den Wert der Variablen 88 00:04:19,110 --> 00:04:20,064 dass Sie noch benannt. 89 00:04:20,064 --> 00:04:23,230 Wenn Sie die Werte jeder wissen wollen lokalen Variablen zugänglich, von wo aus 90 00:04:23,230 --> 00:04:25,970 Sie derzeit in Ihrem Programm können Sie Informationen Einheimische geben. 91 00:04:25,970 --> 00:04:28,332 Es ist viel schneller als drücken Sie p und dann was auch immer, 92 00:04:28,332 --> 00:04:30,540 Listing out all die Variablen, die Sie wissen, existieren. 93 00:04:30,540 --> 00:04:34,370 Sie können Informationen Einheimische geben, und es wird für Sie ausdrucken alles. 94 00:04:34,370 --> 00:04:37,770 Als nächstes ist bt, das ist kurz für zurückzuverfolgen. 95 00:04:37,770 --> 00:04:41,680 Jetzt im Allgemeinen besonders früh in CS50, 96 00:04:41,680 --> 00:04:44,450 Sie werden nicht wirklich Anlass um bt oder Zurück Trace verwenden, 97 00:04:44,450 --> 00:04:47,860 denn Sie sind nicht mit Funktionen dass andere Funktionen aufrufen. 98 00:04:47,860 --> 00:04:50,450 >> Sie könnten Haupt Call a haben Funktion, aber das ist wahrscheinlich es. 99 00:04:50,450 --> 00:04:53,199 Sie müssen nicht, dass andere Funktion Aufruf einer anderen Funktion, die 100 00:04:53,199 --> 00:04:54,880 eine andere Funktion aufruft, und so weiter. 101 00:04:54,880 --> 00:04:57,550 Aber wie Sie Ihre Programme erhalten mehr Komplex, und insbesondere 102 00:04:57,550 --> 00:05:00,290 wenn Sie mit der Arbeit beginnen mit Rekursion zurückSpuren 103 00:05:00,290 --> 00:05:05,150 kann eine wirklich nützliche Methode, um Sie lassen Art bekommen einige Kontext, wo 104 00:05:05,150 --> 00:05:06,460 Ich bin in meinem Programm. 105 00:05:06,460 --> 00:05:10,590 So sagen Sie Ihren Code geschrieben haben, und Sie wissen, dass Haupt ruft eine Funktion 106 00:05:10,590 --> 00:05:14,720 f, die eine Funktion aufruft g, das eine Funktion h aufruft. 107 00:05:14,720 --> 00:05:17,650 So haben wir mehrere Schichten der Verschachtelung hier los ist. 108 00:05:17,650 --> 00:05:19,440 >> Wenn Sie innerhalb bist Ihre GDB Umwelt, 109 00:05:19,440 --> 00:05:21,640 und Sie haben Ihre innen kennen von h, aber Sie vergessen, 110 00:05:21,640 --> 00:05:27,210 über das, was du hast, wo Sie sind-- können Sie bt oder Rückverfolgung geben, 111 00:05:27,210 --> 00:05:32,370 und es wird aus h, g zu drucken, f Haupt, neben einigen anderen Informationen, die 112 00:05:32,370 --> 00:05:35,984 gibt Ihnen einen Hinweis darauf, dass, OK Haupt genannt f, f genannte g, g genannte h, 113 00:05:35,984 --> 00:05:37,900 und das ist, wo ich derzeit bin in meinem Programm. 114 00:05:37,900 --> 00:05:41,380 So kann es sehr nützlich sein, zumal die kryptischen-ness der GDB 115 00:05:41,380 --> 00:05:45,667 wird ein wenig überwältigend, um genau herauszufinden, wo die Dinge sind. 116 00:05:45,667 --> 00:05:48,500 Schließlich, wenn Ihr Programm fertig ist, oder wenn Sie fertig sind Debuggen 117 00:05:48,500 --> 00:05:50,125 und Sie Schritt weg möchten von der GDB-Umgebung, 118 00:05:50,125 --> 00:05:51,940 Es hilft zu wissen, wie man aus ihm herausholen. 119 00:05:51,940 --> 00:05:55,500 Sie können geben Sie q, oder Beenden, um aus. 120 00:05:55,500 --> 00:05:59,220 Jetzt, vor der heutigen Video Ich ein fehlerhaftes Programm vorbereitet 121 00:05:59,220 --> 00:06:03,900 genannt buggy1, die ich zusammengestellt aus einer Datei als buggy1.c bekannt. 122 00:06:03,900 --> 00:06:06,500 Wie Sie vielleicht erwarten, dass diese Programm ist in der Tat fehlerhaft. 123 00:06:06,500 --> 00:06:08,990 Etwas schief geht wenn ich versuche, und führen Sie es. 124 00:06:08,990 --> 00:06:13,014 Nun, leider, ich versehentlich gelöscht meine buggy1.c-Datei, 125 00:06:13,014 --> 00:06:15,930 so in Ordnung für mich, um herauszufinden, was falsch läuft mit diesem Programm, 126 00:06:15,930 --> 00:06:18,770 Ich werde verwenden zu müssen GDB Art von blind, versuchen 127 00:06:18,770 --> 00:06:22,372 um durch dieses Programm zu navigieren genau herauszufinden, was falsch läuft. 128 00:06:22,372 --> 00:06:24,580 Aber mit nur die Werkzeuge, haben wir bereits kennen gelernt haben, 129 00:06:24,580 --> 00:06:27,700 wir können ziemlich Figur herauszufinden, was genau es ist. 130 00:06:27,700 --> 00:06:30,740 Lassen Sie uns also über Kopf zu CS50 IDE und haben einen Blick. 131 00:06:30,740 --> 00:06:33,155 OK, so dass wir hier in meinem CS50 IDE-Umgebung, 132 00:06:33,155 --> 00:06:35,697 und ich werde in ein wenig zu vergrößern so können Sie ein wenig mehr zu sehen. 133 00:06:35,697 --> 00:06:38,530 In meinem Terminal-Fenster, wenn ich Liste der Inhalt meiner derzeitigen Direktor 134 00:06:38,530 --> 00:06:41,250 mit ls, werden wir, die ich sehe haben ein paar Quelldateien 135 00:06:41,250 --> 00:06:44,982 hier, einschließlich der zuvor diskutiert buggy1. 136 00:06:44,982 --> 00:06:46,940 Was genau passiert, wenn Ich versuche und laufen buggy1. 137 00:06:46,940 --> 00:06:47,773 Nun lassen Sie uns herausfinden. 138 00:06:47,773 --> 00:06:52,510 Ich tippe dot Schrägstrich, buggy, und ich drücken Sie Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentation Faults. 140 00:06:53,670 --> 00:06:55,000 Das ist nicht gut. 141 00:06:55,000 --> 00:06:57,180 Wenn Sie sich erinnern, ein Segmentation Fault in der Regel 142 00:06:57,180 --> 00:07:01,540 tritt auf, wenn wir Zugang zu Speicher dass wir uns nicht erlaubt zu berühren. 143 00:07:01,540 --> 00:07:03,820 Wir haben irgendwie erreicht außerhalb der Grenzen 144 00:07:03,820 --> 00:07:05,995 was das Programm, das Compiler, uns gegeben hat. 145 00:07:05,995 --> 00:07:08,310 Und so schon das ist eine Anhaltspunkt in der Toolbox zu halten 146 00:07:08,310 --> 00:07:10,660 wie wir beginnen den Debugging-Prozess. 147 00:07:10,660 --> 00:07:13,620 Etwas hat sich hier ein wenig schief gegangen. 148 00:07:13,620 --> 00:07:15,935 >> In Ordnung, also lassen Sie uns Start up der GDB-Umgebung 149 00:07:15,935 --> 00:07:19,030 und sehen, ob wir herausfinden können was genau das Problem ist. 150 00:07:19,030 --> 00:07:21,674 Ich werde meinen Bildschirm zu löschen, und ich werde geben GDB 151 00:07:21,674 --> 00:07:24,340 einmal, um die GDB Umwelt gelangen, und der Name des Programms, 152 00:07:24,340 --> 00:07:27,450 dass ich zu debuggen, buggy1. 153 00:07:27,450 --> 00:07:30,182 Wir bekommen eine kleine Nachricht, Lesen Symbole aus buggy1, fertig. 154 00:07:30,182 --> 00:07:32,390 Alles, was bedeutet, es ist gezogen zusammen den gesamten Code, 155 00:07:32,390 --> 00:07:35,570 und jetzt ist es in geladen wurde GDB, und es ist bereit zu gehen. 156 00:07:35,570 --> 00:07:37,140 >> Nun, was soll ich tun will? 157 00:07:37,140 --> 00:07:39,130 Haben Sie, was der Rückruf ersten Schritt typischerweise 158 00:07:39,130 --> 00:07:42,540 nachdem ich bin in dieser Umgebung? 159 00:07:42,540 --> 00:07:44,540 Ich hoffe, die Sie gesetzt einen Haltepunkt, denn 160 00:07:44,540 --> 00:07:46,240 in der Tat das ist, was ich tun möchte. 161 00:07:46,240 --> 00:07:47,990 Nun, ich habe nicht die Quellcode für diese 162 00:07:47,990 --> 00:07:50,948 vor mir, das ist wahrscheinlich nicht der typische Anwendungsfall, von der Art und Weise. 163 00:07:50,948 --> 00:07:52,055 Sie werden wahrscheinlich. 164 00:07:52,055 --> 00:07:52,680 Also das ist gut. 165 00:07:52,680 --> 00:07:55,790 Aber angenommen, Sie tun nicht, was ist die eine Funktion, die Sie wissen, 166 00:07:55,790 --> 00:07:58,880 existiert in jedem einzelnen C-Programm? 167 00:07:58,880 --> 00:08:04,420 Egal wie groß oder wie kompliziert sie ist, existiert diese Funktion auf jeden Fall. 168 00:08:04,420 --> 00:08:05,440 Main, nicht wahr? 169 00:08:05,440 --> 00:08:08,870 >> So andernfalls alles andere, können wir einen Haltepunkt am wichtigsten. 170 00:08:08,870 --> 00:08:12,200 Und wieder, ich geben könnte brechen Haupt statt b. 171 00:08:12,200 --> 00:08:14,650 Und wenn Sie neugierig, wenn Sie überhaupt geben Sie einen langen Befehl 172 00:08:14,650 --> 00:08:16,800 und dann feststellen, dass Sie typisiert die falsche Sache, 173 00:08:16,800 --> 00:08:18,770 und Sie loszuwerden möchten vor allem als ich gerade tat, 174 00:08:18,770 --> 00:08:22,029 Sie können steuern, U zu nehmen, die wird löschen alles und bringen Sie zurück 175 00:08:22,029 --> 00:08:23,570 zu Beginn der Cursorlinien. 176 00:08:23,570 --> 00:08:26,569 Viel schneller als Halten Sie einfach die löschen oder schlagen sie ein Bündel Zeiten 177 00:08:26,569 --> 00:08:27,080 über. 178 00:08:27,080 --> 00:08:28,740 >> Also werden wir einen Haltepunkt am Haupt gesetzt. 179 00:08:28,740 --> 00:08:32,970 Und wie Sie sehen können, heißt es, wir haben einen Haltepunkt an Datei buggy1.c, 180 00:08:32,970 --> 00:08:36,330 und anscheinend die erste Zeile der Code der Hauptlinie ist sieben. 181 00:08:36,330 --> 00:08:38,080 Auch hier haben wir nicht Hier die Quelldatei, 182 00:08:38,080 --> 00:08:40,429 aber ich gehe davon aus, dass es sagen mir die Wahrheit. 183 00:08:40,429 --> 00:08:44,510 Und dann, ich versuche nur, und führen Sie das Programm, r. 184 00:08:44,510 --> 00:08:45,360 Startprogramm. 185 00:08:45,360 --> 00:08:48,160 In Ordnung, so dass diese Nachricht ist ein wenig kryptisch. 186 00:08:48,160 --> 00:08:50,160 Aber im Grunde, was ist hier passiert, ist, es ist nur, 187 00:08:50,160 --> 00:08:53,350 sagen mir, ich habe meine Pause traf Punkt, Bruchstelle Nummer 1. 188 00:08:53,350 --> 00:08:55,877 >> Und dann, dass Code-Zeile, Keine solche Datei oder Verzeichnis. 189 00:08:55,877 --> 00:08:57,710 Der einzige Grund, Ich sehe diese Nachricht 190 00:08:57,710 --> 00:09:00,800 ist, weil ich aus Versehen gelöscht meine buggy.c Datei. 191 00:09:00,800 --> 00:09:04,050 Wenn meine buggy1.c Datei existiert im aktuellen Verzeichnis, 192 00:09:04,050 --> 00:09:06,920 diese Linie genau dort würde tatsächlich sagen Sie mir, was die Codezeile 193 00:09:06,920 --> 00:09:08,214 wörtlich liest. 194 00:09:08,214 --> 00:09:09,380 Leider gelöscht ich es. 195 00:09:09,380 --> 00:09:14,790 Wir gehen zu müssen, um Art zu navigieren durch diese ein wenig mehr blind. 196 00:09:14,790 --> 00:09:17,330 >> OK, also lassen Sie uns sehen, was will ich hier tun? 197 00:09:17,330 --> 00:09:21,770 Nun, ich würde gerne wissen, was vor Ort Variablen vielleicht stehen mir zur Verfügung. 198 00:09:21,770 --> 00:09:23,570 Ich habe mein Programm gestartet. 199 00:09:23,570 --> 00:09:28,515 Mal sehen, was sein könnte bereits für uns initialisiert. 200 00:09:28,515 --> 00:09:31,430 Ich tippe Info Einheimischen, keine Einheimischen. 201 00:09:31,430 --> 00:09:33,960 In Ordnung, so dass nicht geben Sie mir eine Tonne von Informationen. 202 00:09:33,960 --> 00:09:37,600 Ich könnte versuchen, und drucken Sie eine variable, aber ich kenne keine Variablennamen. 203 00:09:37,600 --> 00:09:39,930 Ich könnte eine Rückverfolgung zu versuchen, aber ich bin im Inneren des Haupt, 204 00:09:39,930 --> 00:09:43,710 damit ich weiß, habe ich nicht gemacht ein anderer Funktionsaufruf jetzt. 205 00:09:43,710 --> 00:09:47,710 >> So sieht aus wie meine einzige Optionen n oder so verwenden und starten Sie zu tauchen. 206 00:09:47,710 --> 00:09:49,630 Ich werde n verwenden. 207 00:09:49,630 --> 00:09:51,180 Also ich schreibe n. 208 00:09:51,180 --> 00:09:53,060 Oh mein Gott, was ist denn hier los. 209 00:09:53,060 --> 00:09:56,260 Programm empfangenen Signale, SIGSEGV Segmentation Fault, 210 00:09:56,260 --> 00:09:57,880 und dann eine ganze Reihe von Sachen. 211 00:09:57,880 --> 00:09:58,880 Ich bin schon überfordert. 212 00:09:58,880 --> 00:10:00,980 Nun, es ist eigentlich ein Menge zu lernen. 213 00:10:00,980 --> 00:10:02,520 Also, was sagt uns das? 214 00:10:02,520 --> 00:10:09,180 Was es uns sagt, ist, dieses Programm dabei, hat aber noch nicht, seg Fehler. 215 00:10:09,180 --> 00:10:12,550 Und vor allem werde ich in noch weiter hier zu vergrößern, 216 00:10:12,550 --> 00:10:18,980 es geht um den Fehler zu seg so etwas wie strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nun, können wir nicht diskutiert haben diese Funktion ausgiebig. 218 00:10:22,705 --> 00:10:25,580 Aber es ist-- denn wir werden nicht zu sprechen über jede Funktion, 219 00:10:25,580 --> 00:10:28,610 gibt es in der C-Standard library-- aber sie sind alle zu Ihnen zur Verfügung, 220 00:10:28,610 --> 00:10:32,110 insbesondere, wenn Sie nehmen ein Blick auf reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Und strcmp ist ein wirklich leistungsfähiges Funktion, die im Inneren vorhanden ist 222 00:10:35,000 --> 00:10:38,070 der Header string.h Datei, die einen Header 223 00:10:38,070 --> 00:10:41,970 Datei, die auf Funktionen gewidmet ist , dass die Arbeit mit und zu manipulieren Strings. 224 00:10:41,970 --> 00:10:49,830 >> Und vor allem, was tut, ist strcmp Es vergleicht die Werte der zwei Strings. 225 00:10:49,830 --> 00:10:54,160 Also ich bin zu Fehler Segmentierung bei einem Aufruf an strcmp es scheint. 226 00:10:54,160 --> 00:10:58,530 Ich schlug n, und in der Tat bekomme ich die Meldung, Programm mit Signal SIGSEGV beendet 227 00:10:58,530 --> 00:11:01,370 Segmentation Fault. So jetzt Ich habe eigentlich seg bemängelt, 228 00:11:01,370 --> 00:11:06,479 und mein Programm hat ziemlich sehr effektiv aufgegeben. 229 00:11:06,479 --> 00:11:07,770 Dies ist das Ende des Programms. 230 00:11:07,770 --> 00:11:10,370 Er brach zusammen, stürzte sie. 231 00:11:10,370 --> 00:11:14,740 So war nicht viel, aber ich tatsächlich lernen einiges 232 00:11:14,740 --> 00:11:16,747 aus dieser wenig Erfahrung. 233 00:11:16,747 --> 00:11:17,580 Was habe ich gelernt? 234 00:11:17,580 --> 00:11:22,020 Nun, stürzt mein Programm so ziemlich sofort. 235 00:11:22,020 --> 00:11:26,300 Mein Programm stürzt auf Ein Anruf bei strcmp, aber ich 236 00:11:26,300 --> 00:11:30,560 keine lokalen Variablen in meine Programm an der Zeit, dass es abstürzt. 237 00:11:30,560 --> 00:11:37,320 Also, welche Zeichenfolge oder Zeichenfolgen, könnte ich den Vergleich sein. 238 00:11:37,320 --> 00:11:42,140 Wenn ich habe keine lokalen Variablen, können Sie 239 00:11:42,140 --> 00:11:45,520 vermuten, dass ich dort have-- vielleicht ein globale Variable, die wahr sein könnte. 240 00:11:45,520 --> 00:11:47,670 >> Aber im allgemeinen scheint es wie ich bin zu vergleichen 241 00:11:47,670 --> 00:11:52,070 , etwas, das nicht existiert. 242 00:11:52,070 --> 00:11:54,130 Also lassen Sie uns untersuchen, daß ein wenig weiter. 243 00:11:54,130 --> 00:11:55,120 Also werde ich zu meinem Bildschirm zu löschen. 244 00:11:55,120 --> 00:11:57,536 Ich werde von der beenden GDB-Umgebung für eine Sekunde. 245 00:11:57,536 --> 00:12:01,300 Und ich denke, OK, es gibt also keine lokalen Variablen in meinem Programm. 246 00:12:01,300 --> 00:12:06,444 Ich frage mich, ob vielleicht soll ich weitergeben in einem String als Befehlszeilenargument. 247 00:12:06,444 --> 00:12:07,610 Lassen Sie uns also nur zu testen dies. 248 00:12:07,610 --> 00:12:09,020 Ich habe nicht getan. 249 00:12:09,020 --> 00:12:14,244 >> Mal sehen, ob vielleicht, wenn ich dieses Programm mit einem Kommandozeilenargument es funktioniert. 250 00:12:14,244 --> 00:12:16,140 Huh, keine Segmentation Fault gibt. 251 00:12:16,140 --> 00:12:17,870 Er sagte mir nur, dass ich es herausgefunden. 252 00:12:17,870 --> 00:12:19,170 Also vielleicht ist das das Update hier. 253 00:12:19,170 --> 00:12:27,560 Und in der Tat, wenn ich gehen Sie zurück und betrachten der eigentliche Quellcode für buggy1.c, 254 00:12:27,560 --> 00:12:31,180 es scheint, als ob das, was ich tue, ist Ich mache einen Anruf an, ohne strcmp 255 00:12:31,180 --> 00:12:34,010 Prüfen, ob in der Tat argv [1] existiert. 256 00:12:34,010 --> 00:12:36,730 Dies tatsächlich die Quellcode für buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Also, was ich wirklich brauchen, um tun Sie hier, um mein Programm zu beheben, 258 00:12:38,855 --> 00:12:40,835 vorausgesetzt, ich habe die Datei vor mir ist 259 00:12:40,835 --> 00:12:44,740 fügen Sie einfach einen Scheck zu machen Sie sicher, dass argc gleich 2. 260 00:12:44,740 --> 00:12:47,780 So ist dieses Beispiel noch einmal, wie ich schon sagte, ist ein wenig gekünstelt, nicht wahr? 261 00:12:47,780 --> 00:12:49,840 Sie sind in der Regel nicht zu gehen Versehen Sie Ihre Source-Code zu löschen 262 00:12:49,840 --> 00:12:51,820 und müssen dann versuchen, und Debuggen des Programms. 263 00:12:51,820 --> 00:12:53,120 Aber hoffentlich, es gab Sie eine Illustration 264 00:12:53,120 --> 00:12:55,120 der Arten von Dingen, Sie könnte zu denken, 265 00:12:55,120 --> 00:12:56,610 wie Sie das Debugging Ihres Programms sind. 266 00:12:56,610 --> 00:12:58,760 >> Was ist der Stand der Dinge hier? 267 00:12:58,760 --> 00:13:00,510 Welche Variablen muss ich müssen zugänglich bleiben? 268 00:13:00,510 --> 00:13:03,600 Wo genau ist mein Programm Absturz, auf welcher Linie, 269 00:13:03,600 --> 00:13:05,240 auf welchem ​​Aufruf an welche Funktion? 270 00:13:05,240 --> 00:13:06,952 Welche Art von Hinweisen nicht, dass mir geben? 271 00:13:06,952 --> 00:13:08,910 Und das ist genau das Art der Denkweise, dass Sie 272 00:13:08,910 --> 00:13:12,820 sollte immer sein, wenn Sie in die Nachdenken über das Debugging Ihrer Programme. 273 00:13:12,820 --> 00:13:13,820 >> Ich bin Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Dies ist CS50. 275 00:13:16,140 --> 00:15:08,642