1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Εντάξει GDB. 3 00:00:06,830 --> 00:00:08,480 Τι είναι αυτό ακριβώς; 4 00:00:08,480 --> 00:00:11,310 Έτσι GDB, η οποία βρίσκεται για το GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 είναι ένα πραγματικά φοβερό εργαλείο που μπορούμε να χρησιμοποιούμε για να μας βοηθήσει στον εντοπισμό σφαλμάτων προγράμματα μας, 6 00:00:15,040 --> 00:00:18,210 ή να βρείτε πού είναι τα πράγματα πάει καλά στα προγράμματά μας. 7 00:00:18,210 --> 00:00:22,590 GDB είναι εκπληκτικά ισχυρό, αλλά η έξοδος και η αλληλεπίδραση με αυτό 8 00:00:22,590 --> 00:00:23,830 μπορεί να είναι λίγο αινιγματικά. 9 00:00:23,830 --> 00:00:28,210 Είναι συνήθως ένα εργαλείο γραμμής εντολών, και μπορεί να ρίξει πολλά μηνύματα σε σας. 10 00:00:28,210 --> 00:00:31,144 Και μπορεί κάπως δύσκολο να αναλύσει ακριβώς τι συμβαίνει. 11 00:00:31,144 --> 00:00:33,560 Ευτυχώς, έχουμε λάβει μέτρα για να διορθώσετε αυτό το πρόβλημα για εσάς 12 00:00:33,560 --> 00:00:36,281 καθώς εργάζεστε με CS50. 13 00:00:36,281 --> 00:00:39,030 Εάν δεν χρησιμοποιείτε το γραφικό εντοπισμού σφαλμάτων, το οποίο ο συνάδελφός μου ο Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse έχει μιλήσει αρκετά ένα κομμάτι περίπου σε ένα βίντεο που 15 00:00:41,570 --> 00:00:44,740 θα πρέπει να είναι εδώ αυτή τη στιγμή, μπορεί να χρειαστείτε 16 00:00:44,740 --> 00:00:48,270 Για να χρησιμοποιήσετε αυτές γραμμής εντολών εργαλεία για να συνεργαστεί με το GDB. 17 00:00:48,270 --> 00:00:51,250 Εάν εργάζεστε στο CS50 IDE, δεν χρειάζεται να το κάνουμε αυτό. 18 00:00:51,250 --> 00:00:53,550 Αλλά αν δεν είστε εργάζονται στο CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 ίσως χρησιμοποιείτε μια έκδοση του CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 ή άλλο Linux λειτουργικό Σύστημα με GDB τοποθετημένη σε αυτό, 21 00:00:58,860 --> 00:01:00,980 μπορεί να χρειαστεί να χρησιμοποιήσουν Αυτά τα εργαλεία της γραμμής εντολών. 22 00:01:00,980 --> 00:01:02,860 >> Και επειδή ίσως Πρέπει να το κάνουμε αυτό, είναι 23 00:01:02,860 --> 00:01:06,280 χρήσιμο μόνο για να καταλάβουμε πώς GDB λειτουργεί από τη γραμμή εντολών. 24 00:01:06,280 --> 00:01:09,650 Αλλά και πάλι, αν είστε χρησιμοποιώντας το IDE CS50, που 25 00:01:09,650 --> 00:01:15,400 μπορούν να χρησιμοποιήσουν το γραφικό πρόγραμμα εντοπισμού σφαλμάτων που είναι χτισμένη μέσα στο IDE. 26 00:01:15,400 --> 00:01:18,750 Έτσι για να πάρετε τα πράγματα πηγαίνουν με GDB, για να ξεκινήσει η αποσφαλμάτωση 27 00:01:18,750 --> 00:01:21,220 διαδικασία ενός συγκεκριμένου πρόγραμμα, το μόνο που χρειάζεται να κάνετε 28 00:01:21,220 --> 00:01:23,810 είναι ο τύπος που ακολουθείται GDB από το όνομα του προγράμματος. 29 00:01:23,810 --> 00:01:28,620 Έτσι, για παράδειγμα, αν το πρόγραμμά σας είναι Γεια σας, πρέπει να πληκτρολογήσετε GDB γεια. 30 00:01:28,620 --> 00:01:31,210 >> Όταν το κάνετε αυτό, θα πάμε να σηκώσει το περιβάλλον GDB. 31 00:01:31,210 --> 00:01:33,800 Έγκαιρη σας θα αλλάξει, και αντί να είναι ό, τι συνήθως 32 00:01:33,800 --> 00:01:35,841 είναι όταν πληκτρολογείτε τα πράγματα στις line-- εντολή ls, 33 00:01:35,841 --> 00:01:38,115 cd-- όλα τα τυπικά σας Εντολές του Linux, προτροπή σας 34 00:01:38,115 --> 00:01:42,200 θα αλλάξει σε, μάλλον, κάτι όπως παρενθέσεις GDB παρενθέσεις. 35 00:01:42,200 --> 00:01:46,630 Αυτό είναι νέο προτροπή GDB σας, επειδή είστε μέσα στο περιβάλλον GDB. 36 00:01:46,630 --> 00:01:49,830 Μόλις στο εσωτερικό του εν λόγω περιβάλλοντος, υπάρχουν δύο μεγάλες εντολές 37 00:01:49,830 --> 00:01:52,290 ότι θα πρέπει πιθανώς να χρησιμοποιήσετε με την ακόλουθη σειρά. 38 00:01:52,290 --> 00:01:55,200 >> Η πρώτη είναι η Β, η οποία είναι μικρή για διάλειμμα. 39 00:01:55,200 --> 00:01:58,690 Και μετά την πληκτρολόγηση β, που συνήθως πληκτρολογήστε το όνομα της συνάρτησης, 40 00:01:58,690 --> 00:02:01,040 ή αν τυχαίνει να γνωρίζω γύρω από αυτό τον αριθμό γραμμής 41 00:02:01,040 --> 00:02:04,100 το πρόγραμμά σας έχει αρχίσει να συμπεριφέρεται λίγο παράξενα, 42 00:02:04,100 --> 00:02:06,370 μπορείτε να πληκτρολογήσετε μια γραμμή Αριθμός εκεί. 43 00:02:06,370 --> 00:02:09,660 Ποια β, ή να σπάσει, δεν είναι ότι επιτρέπει το πρόγραμμά σας 44 00:02:09,660 --> 00:02:13,270 να τρέχει μέχρι ένα ορισμένο σημείο, δηλαδή, το όνομα της συνάρτησης 45 00:02:13,270 --> 00:02:15,880 να καθορίσετε ή η γραμμή αριθμό που εσείς καθορίζετε. 46 00:02:15,880 --> 00:02:18,590 >> Και στο σημείο αυτό, θα παγώσει την εκτέλεση. 47 00:02:18,590 --> 00:02:21,670 Αυτό είναι ένα πολύ καλό πράγμα, επειδή μια φορά η εκτέλεση έχει παγώσει, 48 00:02:21,670 --> 00:02:25,214 μπορείτε να αρχίσετε να πολύ αργά βήμα μέσα από το πρόγραμμά σας. 49 00:02:25,214 --> 00:02:28,130 Συνήθως, αν έχετε τρέξιμο προγράμματά σας, είναι αρκετά μικρή. 50 00:02:28,130 --> 00:02:31,250 Συνήθως, πληκτρολογείτε dot κάθετος ανεξαρτήτως το όνομα του προγράμματος σας, πατήστε Enter, 51 00:02:31,250 --> 00:02:33,470 και για να μπορέσετε να αναβοσβήνει, σας το πρόγραμμα έχει ήδη τελειώσει. 52 00:02:33,470 --> 00:02:36,620 Δεν είναι πραγματικά πολύ χρόνο για να δοκιμάσετε και να καταλάβω τι συμβαίνει λάθος. 53 00:02:36,620 --> 00:02:40,920 Γι 'αυτό πραγματικά να είναι σε θέση να επιβραδύνει τα πράγματα ρυθμίζοντας το σημείο καμπής με β, 54 00:02:40,920 --> 00:02:43,040 και στη συνέχεια να πατήσουν. 55 00:02:43,040 --> 00:02:46,169 >> Στη συνέχεια, αφού έχετε ρυθμίσει το διάλειμμά σας σημείο, μπορείτε να εκτελέσετε το πρόγραμμα. 56 00:02:46,169 --> 00:02:47,960 Και αν έχετε οποιαδήποτε επιχειρήματα της γραμμής εντολών, 57 00:02:47,960 --> 00:02:51,610 μπορείτε να καθορίσετε εδώ, όχι όταν πληκτρολογείτε GDB όνομα του προγράμματός σας. 58 00:02:51,610 --> 00:02:55,980 Μπορείτε να καθορίσετε το σύνολο της γραμμής εντολών επιχειρήματα με τη λήψη r, ή να τρέξει, 59 00:02:55,980 --> 00:03:00,270 και, στη συνέχεια, τα επιχειρήματα της γραμμής εντολών ανεξαρτήτως θα πρέπει να έχετε στο εσωτερικό του προγράμματός σας. 60 00:03:00,270 --> 00:03:03,510 Υπάρχουν ένας αριθμός άλλων πραγματικά σημαντικές και χρήσιμες εντολές 61 00:03:03,510 --> 00:03:04,970 εντός του περιβάλλοντος του ΑΕΠ. 62 00:03:04,970 --> 00:03:07,540 Έτσι, επιτρέψτε μου να γρήγορα πάει πάνω από μερικά από αυτά. 63 00:03:07,540 --> 00:03:11,320 >> Το πρώτο είναι η, η οποία είναι μικρή για την επόμενη, και μπορείτε να πληκτρολογήσετε την επόμενη αντί της Ν, 64 00:03:11,320 --> 00:03:12,304 τόσο θα μπορούσε να λειτουργήσει. 65 00:03:12,304 --> 00:03:13,470 Και αυτό είναι μόνο η στενογραφία. 66 00:03:13,470 --> 00:03:17,540 Και όπως έχετε πιθανώς ήδη πάρει χρησιμοποιείται για να, να είναι σε θέση να πληκτρολογήσετε τα πράγματα 67 00:03:17,540 --> 00:03:20,520 μικρότερη είναι γενικά καλύτερα. 68 00:03:20,520 --> 00:03:24,100 Και τι θα κάνουμε είναι ότι θα βήμα προς τα εμπρός ένα μπλοκ του κώδικα. 69 00:03:24,100 --> 00:03:26,170 Γι 'αυτό θα προχωρήσουμε προς τα εμπρός μέχρι μια κλήση συνάρτησης. 70 00:03:26,170 --> 00:03:28,350 Και στη συνέχεια, αντί του καταδύσεις σε αυτή την λειτουργία 71 00:03:28,350 --> 00:03:33,130 και να περάσει από όλα αυτά λειτουργίες κώδικα, θα έχει απλά τη λειτουργία. 72 00:03:33,130 --> 00:03:34,400 >> Η λειτουργία αυτή θα πρέπει να ονομάζεται. 73 00:03:34,400 --> 00:03:35,733 Θα κάνουμε ό, τι είναι το έργο της. 74 00:03:35,733 --> 00:03:38,870 Θα επιστρέψει μια τιμή στο η λειτουργία που ζητούσε. 75 00:03:38,870 --> 00:03:42,490 Και τότε θα προχωρήσουμε στην επόμενη γραμμή αυτής της λειτουργίας κλήσης. 76 00:03:42,490 --> 00:03:44,555 Αν θέλετε να το βήμα εντός της συνάρτησης, 77 00:03:44,555 --> 00:03:46,430 και όχι μόνο με το εκτελέσει, ειδικά 78 00:03:46,430 --> 00:03:50,004 αν νομίζετε ότι το πρόβλημα μπορεί να βρίσκονται στο εσωτερικό αυτής της λειτουργίας, 79 00:03:50,004 --> 00:03:52,670 θα μπορούσε, φυσικά, ορίστε ένα διάλειμμα σημείο εντός αυτής της λειτουργίας. 80 00:03:52,670 --> 00:03:57,820 Ή αν είστε ήδη σε λειτουργία, μπορείτε να Χρησιμοποιήστε το S για βήμα προς τα εμπρός μία γραμμή κώδικα. 81 00:03:57,820 --> 00:04:01,170 >> Έτσι, αυτό θα παρέμβουν και να βουτήξει λειτουργίες, 82 00:04:01,170 --> 00:04:04,750 αντί να έχουν ακριβώς το εκτελέσει και συνεχίζοντας σε λειτουργία 83 00:04:04,750 --> 00:04:07,380 ότι είστε μέσα για τον εντοπισμό σφαλμάτων. 84 00:04:07,380 --> 00:04:09,870 Αν ποτέ θέλετε να ξέρετε η τιμή μιας μεταβλητής, 85 00:04:09,870 --> 00:04:12,507 μπορείτε να πληκτρολογήσετε p, ή εκτύπωσης, και στη συνέχεια το όνομα της μεταβλητής. 86 00:04:12,507 --> 00:04:15,090 Και αυτό θα εκτυπώσετε σε εσάς, στο εσωτερικό του περιβάλλοντος GDB, 87 00:04:15,090 --> 00:04:19,110 το όνομα της μεταβλητής, ότι you-- δικαιολογία me-- την τιμή της μεταβλητής 88 00:04:19,110 --> 00:04:20,064 ότι έχετε το όνομα. 89 00:04:20,064 --> 00:04:23,230 Αν θέλετε να μάθετε τις τιμές του κάθε τοπική μεταβλητή προσβάσιμο από όπου 90 00:04:23,230 --> 00:04:25,970 Αυτήν τη στιγμή είναι στο σας το πρόγραμμα, μπορείτε να πληκτρολογήσετε πληροφορίες ντόπιους. 91 00:04:25,970 --> 00:04:28,332 Είναι πολύ πιο γρήγορα από ό, τι πατώντας p και στη συνέχεια ό, 92 00:04:28,332 --> 00:04:30,540 λίστα από όλα τα μεταβλητές που ξέρετε υπάρχουν. 93 00:04:30,540 --> 00:04:34,370 Μπορείτε να πληκτρολογήσετε πληροφορίες ντόπιους, και θα εκτυπώνει τα πάντα για σένα. 94 00:04:34,370 --> 00:04:37,770 Επόμενο είναι η BT, η οποία είναι σύντομη για την Επιστροφή Trace. 95 00:04:37,770 --> 00:04:41,680 Τώρα, γενικά, ιδιαίτερα στην αρχή της CS50, 96 00:04:41,680 --> 00:04:44,450 δεν θα έχουν πραγματικά την ευκαιρία να χρησιμοποιήσει BT, ή Πίσω Trace, 97 00:04:44,450 --> 00:04:47,860 επειδή δεν είστε έχοντας λειτουργίες ότι καλούν άλλες λειτουργίες. 98 00:04:47,860 --> 00:04:50,450 >> Μπορεί να έχετε μια κύρια πρόσκληση λειτουργία, αλλά αυτό είναι πιθανώς. 99 00:04:50,450 --> 00:04:53,199 Δεν έχουν αυτό το άλλο λειτουργία καλώντας άλλη λειτουργία, η οποία 100 00:04:53,199 --> 00:04:54,880 καλεί μια άλλη λειτουργία, και ούτω καθεξής. 101 00:04:54,880 --> 00:04:57,550 Αλλά, όπως τα προγράμματα σας να πάρετε περισσότερα πολύπλοκη, και ειδικότερα 102 00:04:57,550 --> 00:05:00,290 όταν αρχίσουν να εργάζονται με αναδρομή, πίσω ίχνος 103 00:05:00,290 --> 00:05:05,150 μπορεί να είναι ένα πραγματικά χρήσιμο τρόπο για να αφήσετε είδος πάρει κάποιο πλαίσιο για το πού 104 00:05:05,150 --> 00:05:06,460 Είμαι στο πρόγραμμα μου. 105 00:05:06,460 --> 00:05:10,590 Έτσι λένε έχετε γράψει τον κωδικό σας, και Γνωρίζετε ότι ο κύριος καλεί μια συνάρτηση 106 00:05:10,590 --> 00:05:14,720 στ, η οποία καλεί μια συνάρτηση g, το οποίο καλεί μια συνάρτηση h. 107 00:05:14,720 --> 00:05:17,650 Έτσι έχουμε πολλές στρώσεις της ένθεσης συμβαίνει εδώ. 108 00:05:17,650 --> 00:05:19,440 >> Αν είστε μέσα του GDB το περιβάλλον σας, 109 00:05:19,440 --> 00:05:21,640 και ξέρετε μέσα σας του h, αλλά ξεχάσετε 110 00:05:21,640 --> 00:05:27,210 σχετικά με το τι έχεις εκεί που are-- μπορείτε να πληκτρολογήσετε BT, ή πίσω ίχνος, 111 00:05:27,210 --> 00:05:32,370 και θα εκτυπώσει h, g, f κύρια, μαζί με κάποιες άλλες πληροφορίες, οι οποίες 112 00:05:32,370 --> 00:05:35,984 σας δίνει μια ένδειξη ότι, εντάξει κύρια ονομάζονται f, f ονομάζεται g, g ονομάζεται h, 113 00:05:35,984 --> 00:05:37,900 και αυτό είναι όπου σήμερα είμαι στο πρόγραμμά μου. 114 00:05:37,900 --> 00:05:41,380 Έτσι, μπορεί να είναι πραγματικά χρήσιμη, ιδιαίτερα καθώς η κρυπτική-κότητας της GDB 115 00:05:41,380 --> 00:05:45,667 γίνεται λίγο συντριπτική, για να μάθετε πού ακριβώς είναι τα πράγματα. 116 00:05:45,667 --> 00:05:48,500 Τέλος, όταν το πρόγραμμά σας γίνεται, ή όταν τελειώσετε το debugging 117 00:05:48,500 --> 00:05:50,125 και θέλετε να απομακρυνθείτε από το περιβάλλον GDB, 118 00:05:50,125 --> 00:05:51,940 βοηθά να ξέρει πώς να βγούμε από αυτό. 119 00:05:51,940 --> 00:05:55,500 Μπορείτε να πληκτρολογήσετε q, ή Έξοδος, να βγούμε. 120 00:05:55,500 --> 00:05:59,220 Τώρα, πριν από τη σημερινή βίντεο Έχω ετοιμάσει ένα πρόγραμμα με λάθη 121 00:05:59,220 --> 00:06:03,900 που ονομάζεται buggy1, η οποία θα συντάξει από ένα αρχείο γνωστό ως buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Όπως μπορείτε να φανταστείτε, αυτό το πρόγραμμα είναι πράγματι προβληματικό. 123 00:06:06,500 --> 00:06:08,990 Κάτι πάει στραβά όταν προσπαθώ και να το εκτελέσετε. 124 00:06:08,990 --> 00:06:13,014 Τώρα, δυστυχώς, έχω λάθος διαγραμμένο αρχείο buggy1.c μου, 125 00:06:13,014 --> 00:06:15,930 έτσι ώστε για μένα να καταλάβω τι πηγαίνει στραβά με αυτό το πρόγραμμα, 126 00:06:15,930 --> 00:06:18,770 Πάω να πρέπει να χρησιμοποιήσετε GDB είδους τυφλά, προσπαθώντας 127 00:06:18,770 --> 00:06:22,372 για να περιηγηθείτε μέσα από αυτό το πρόγραμμα για την καταλάβουμε ακριβώς τι πηγαίνει στραβά. 128 00:06:22,372 --> 00:06:24,580 Αλλά χρησιμοποιώντας μόνο τα εργαλεία έχουμε ήδη μάθει για, 129 00:06:24,580 --> 00:06:27,700 μπορούμε λίγο πολύ εικόνα τι ακριβώς είναι. 130 00:06:27,700 --> 00:06:30,740 Οπότε ας το κεφάλι πάνω σε CS50 IDE και ρίξτε μια ματιά. 131 00:06:30,740 --> 00:06:33,155 Εντάξει, έτσι είμαστε εδώ μου CS50 IDE περιβάλλον, 132 00:06:33,155 --> 00:06:35,697 και θα κάνετε ζουμ σε λίγο ώστε να μπορείτε να δείτε λίγο περισσότερο. 133 00:06:35,697 --> 00:06:38,530 Στο παράθυρο τερματικού μου, αν μπορώ λίστα το περιεχόμενο του σημερινού διευθυντή μου 134 00:06:38,530 --> 00:06:41,250 με ls, θα δούμε ότι εγώ έχουν ένα ζευγάρι από τα αρχεία πηγής 135 00:06:41,250 --> 00:06:44,982 εδώ, συμπεριλαμβανομένης της συζητήθηκαν προηγουμένως buggy1. 136 00:06:44,982 --> 00:06:46,940 Τι συμβαίνει ακριβώς όταν Προσπαθώ και να τρέξει buggy1. 137 00:06:46,940 --> 00:06:47,773 Λοιπόν ας μάθουμε. 138 00:06:47,773 --> 00:06:52,510 Τύπου Ι dot κάθετος, λάθη, και εγώ πατήστε Enter. 139 00:06:52,510 --> 00:06:53,670 >> Τμηματοποίηση ρηγμάτων. 140 00:06:53,670 --> 00:06:55,000 Αυτό δεν είναι καλό. 141 00:06:55,000 --> 00:06:57,180 Αν θυμάστε, ένα τμηματοποίηση βλάβη συνήθως 142 00:06:57,180 --> 00:07:01,540 συμβαίνει όταν έχουμε πρόσβαση στη μνήμη ότι δεν είμαστε επιτρέπεται να αγγίξει. 143 00:07:01,540 --> 00:07:03,820 Έχουμε φτάσει με κάποιο τρόπο έξω από τα όρια 144 00:07:03,820 --> 00:07:05,995 τι το πρόγραμμα, η compiler, μας έχει δώσει. 145 00:07:05,995 --> 00:07:08,310 Και έτσι αυτό είναι ήδη μια ιδέα να κρατήσει στην εργαλειοθήκη 146 00:07:08,310 --> 00:07:10,660 όπως έχουμε ξεκινήσει η διαδικασία εντοπισμού σφαλμάτων. 147 00:07:10,660 --> 00:07:13,620 Κάτι έχει πάει λίγο στραβά εδώ. 148 00:07:13,620 --> 00:07:15,935 >> Εντάξει, οπότε ας ξεκινήσουμε μέχρι το περιβάλλον GDB 149 00:07:15,935 --> 00:07:19,030 και να δούμε αν μπορούμε να καταλάβουμε τι ακριβώς είναι το πρόβλημα. 150 00:07:19,030 --> 00:07:21,674 Πάω για να καθαρίσετε την οθόνη μου, και Πάω να πληκτρολογήσετε GDB 151 00:07:21,674 --> 00:07:24,340 και πάλι, να εισέλθουν στο περιβάλλον GDB, και το όνομα του προγράμματος 152 00:07:24,340 --> 00:07:27,450 ότι θέλετε να διορθώσετε, buggy1. 153 00:07:27,450 --> 00:07:30,182 Παίρνουμε ένα μικρό μήνυμα, διαβάζοντας σύμβολα από buggy1, έγινε. 154 00:07:30,182 --> 00:07:32,390 Το μόνο που σημαίνει είναι ότι τράβηξε μαζί ολόκληρος ο κώδικας, 155 00:07:32,390 --> 00:07:35,570 και τώρα είναι ήδη φορτωθεί σε GDB, και είναι έτοιμα να ξεκινήσουν. 156 00:07:35,570 --> 00:07:37,140 >> Τώρα, τι θέλω να κάνω; 157 00:07:37,140 --> 00:07:39,130 Θυμάστε τι το το πρώτο βήμα είναι τυπικά 158 00:07:39,130 --> 00:07:42,540 αφού είμαι μέσα του αυτό το περιβάλλον; 159 00:07:42,540 --> 00:07:44,540 Ας ελπίσουμε ότι, το εν λόγω σύνολο ένα σημείο καμπής, διότι 160 00:07:44,540 --> 00:07:46,240 Στην πραγματικότητα αυτό είναι ό, τι θέλω να κάνω. 161 00:07:46,240 --> 00:07:47,990 Τώρα, δεν έχω το πηγαίο κώδικα για αυτό 162 00:07:47,990 --> 00:07:50,948 μπροστά μου, το οποίο είναι πιθανώς δεν είναι η τυπική περίπτωση χρήσης, από τον τρόπο. 163 00:07:50,948 --> 00:07:52,055 Μάλλον θα. 164 00:07:52,055 --> 00:07:52,680 Έτσι, αυτό είναι καλό. 165 00:07:52,680 --> 00:07:55,790 Αλλά υποθέτοντας δεν το κάνετε, ό, τι είναι η μία λειτουργία που ξέρετε 166 00:07:55,790 --> 00:07:58,880 υπάρχει σε κάθε πρόγραμμα C; 167 00:07:58,880 --> 00:08:04,420 Δεν έχει σημασία πόσο μεγάλο ή πολύπλοκο είναι, σίγουρα υπάρχει αυτή η λειτουργία. 168 00:08:04,420 --> 00:08:05,440 Κύρια, σωστά; 169 00:08:05,440 --> 00:08:08,870 >> Έτσι, παραλείποντας όλα τα άλλα, μπορούμε να ορίσετε ένα σημείο καμπής στην κύρια. 170 00:08:08,870 --> 00:08:12,200 Και πάλι, θα μπορούσα απλά πληκτρολογήστε σπάσει κύριο, αντί της β. 171 00:08:12,200 --> 00:08:14,650 Και αν είστε περίεργοι, αν ποτέ πληκτρολογήστε έναν μακρύ εντολή 172 00:08:14,650 --> 00:08:16,800 και στη συνέχεια να συνειδητοποιήσουν ότι πληκτρολογήσει το λάθος πράγμα, 173 00:08:16,800 --> 00:08:18,770 και θέλετε να ξεφορτωθείτε όλα όπως έκανα ακριβώς, 174 00:08:18,770 --> 00:08:22,029 μπορείτε να πάρετε τον έλεγχο U, το οποίο θα διαγράψει τα πάντα και να σας φέρει πίσω 175 00:08:22,029 --> 00:08:23,570 στην αρχή των γραμμών δρομέα. 176 00:08:23,570 --> 00:08:26,569 Μια πολύ πιο γρήγορα από ό, τι ακριβώς κρατήστε πατημένο το πλήκτρο διαγράψετε, ή χτυπώντας το ένα μάτσο φορές 177 00:08:26,569 --> 00:08:27,080 πάνω. 178 00:08:27,080 --> 00:08:28,740 >> Έτσι θα ορίσετε ένα σημείο καμπής στην κύρια. 179 00:08:28,740 --> 00:08:32,970 Και όπως μπορείτε να δείτε, λέει έχουμε ορίσετε ένα σημείο καμπής στο αρχείο buggy1.c, 180 00:08:32,970 --> 00:08:36,330 και προφανώς η πρώτη γραμμή του κώδικα της κύριας γραμμής είναι επτά. 181 00:08:36,330 --> 00:08:38,080 Και πάλι, δεν έχουμε το αρχείο προέλευσης εδώ, 182 00:08:38,080 --> 00:08:40,429 αλλά εγώ θα υποθέσουμε ότι είναι να μου λέει την αλήθεια. 183 00:08:40,429 --> 00:08:44,510 Και στη συνέχεια, απλώς προσπαθώ και εκτελέστε το πρόγραμμα, r. 184 00:08:44,510 --> 00:08:45,360 Ξεκινώντας το πρόγραμμα. 185 00:08:45,360 --> 00:08:48,160 Εντάξει, έτσι ώστε αυτό το μήνυμα είναι ένα μικρό κρυπτικό. 186 00:08:48,160 --> 00:08:50,160 Αλλά βασικά τι είναι συμβαίνει εδώ είναι ότι είναι απλά 187 00:08:50,160 --> 00:08:53,350 λέγοντάς μου ότι έχω χτυπήσει διάλειμμα μου σημείο, διάλειμμα αριθμό σημείου 1. 188 00:08:53,350 --> 00:08:55,877 >> Και στη συνέχεια, ότι η γραμμή του κώδικα, Δεν υπάρχει τέτοιο αρχείο ή κατάλογος. 189 00:08:55,877 --> 00:08:57,710 Ο μόνος λόγος για τον οποίο Βλέπω το μήνυμα 190 00:08:57,710 --> 00:09:00,800 Είναι επειδή κατά λάθος διαγράφεται buggy.c το αρχείο μου. 191 00:09:00,800 --> 00:09:04,050 Αν buggy1.c αρχείο μου υπήρχε στον τρέχοντα κατάλογο, 192 00:09:04,050 --> 00:09:06,920 ότι το δικαίωμα γραμμή θα υπάρχει πραγματικά πες μου ποια είναι η γραμμή κώδικα 193 00:09:06,920 --> 00:09:08,214 κυριολεκτικά διαβάζει. 194 00:09:08,214 --> 00:09:09,380 Δυστυχώς, αυτό διαγράφεται. 195 00:09:09,380 --> 00:09:14,790 Εμείς πάμε για να πλοηγηθείτε είδος του μέσω αυτής λίγο περισσότερο στα τυφλά. 196 00:09:14,790 --> 00:09:17,330 >> ΟΚ, οπότε ας δούμε, τι δεν θέλω να κάνω εδώ; 197 00:09:17,330 --> 00:09:21,770 Λοιπόν, θα ήθελα να ξέρω τι τοπικών μεταβλητές ίσως είναι στη διάθεσή μου. 198 00:09:21,770 --> 00:09:23,570 Έχω αρχίσει το πρόγραμμά μου. 199 00:09:23,570 --> 00:09:28,515 Ας δούμε τι θα μπορούσε να είναι έχουν ήδη προετοιμαστεί για εμάς. 200 00:09:28,515 --> 00:09:31,430 Τύπου Ι Πληροφορίες ντόπιους, δεν τους ντόπιους. 201 00:09:31,430 --> 00:09:33,960 Εντάξει, έτσι ώστε να μην να μου δώσει έναν τόνο των πληροφοριών. 202 00:09:33,960 --> 00:09:37,600 Θα μπορούσα να προσπαθήσω και να εκτυπώσετε μια μεταβλητή, αλλά δεν ξέρω κανένα ονόματα των μεταβλητών. 203 00:09:37,600 --> 00:09:39,930 Θα μπορούσατε να δοκιμάσετε ένα ίχνος πίσω, αλλά είμαι μέσα της κύριας, 204 00:09:39,930 --> 00:09:43,710 έτσι ξέρω δεν έχω κάνει μια άλλη κλήση της συνάρτησης τώρα. 205 00:09:43,710 --> 00:09:47,710 >> Έτσι μοιάζει μόνο οι επιλογές μου είναι για χρήση n ή έτσι και να αρχίσουν να βουτήξει μέσα. 206 00:09:47,710 --> 00:09:49,630 Πάω να χρησιμοποιήσετε n. 207 00:09:49,630 --> 00:09:51,180 Γι 'αυτό και τύπου n. 208 00:09:51,180 --> 00:09:53,060 Θεέ μου, τι συμβαίνει εδώ. 209 00:09:53,060 --> 00:09:56,260 Πρόγραμμα λαμβανόμενα σήματα, SIGSEGV τμηματοποίηση σφάλμα, 210 00:09:56,260 --> 00:09:57,880 και στη συνέχεια ένα σωρό πράγματα. 211 00:09:57,880 --> 00:09:58,880 Είμαι ήδη κυριεύσει. 212 00:09:58,880 --> 00:10:00,980 Λοιπόν, υπάρχει πράγματι μια πολλά που πρέπει να μάθει εδώ. 213 00:10:00,980 --> 00:10:02,520 Έτσι τι μας λέει αυτό; 214 00:10:02,520 --> 00:10:09,180 Τι μας λέει είναι, αυτό το πρόγραμμα είναι περίπου, αλλά δεν έχει ακόμη, SEG σφάλμα. 215 00:10:09,180 --> 00:10:12,550 Και συγκεκριμένα, θα πάω για να μεγεθύνετε ακόμη περισσότερο εδώ, 216 00:10:12,550 --> 00:10:18,980 είναι έτοιμος να SEG σφάλμα περίπου κάτι που ονομάζεται strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Τώρα, μπορεί να μην έχουμε συζητήθηκαν Αυτή η λειτουργία εκτενώς. 218 00:10:22,705 --> 00:10:25,580 Αλλά is-- επειδή εμείς δεν πρόκειται για να μιλήσουμε για κάθε λειτουργία που 219 00:10:25,580 --> 00:10:28,610 υπάρχει στο πρότυπο C library-- αλλά είναι όλα στη διάθεσή σας, 220 00:10:28,610 --> 00:10:32,110 ιδιαίτερα εάν παίρνετε ένα δείτε reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Και strcmp είναι ένα πραγματικά ισχυρό λειτουργία που υπάρχει μέσα 222 00:10:35,000 --> 00:10:38,070 της string.h επικεφαλίδα αρχείο, το οποίο είναι μια κεφαλίδα 223 00:10:38,070 --> 00:10:41,970 αρχείο που είναι αφιερωμένο στις λειτουργίες ότι η εργασία με χορδές και να χειριστούν. 224 00:10:41,970 --> 00:10:49,830 >> Και κυρίως, τι κάνει είναι strcmp συγκρίνει τις τιμές των δύο χορδές. 225 00:10:49,830 --> 00:10:54,160 Έτσι είμαι έτοιμος σε κατακερματισμό της βλάβης σε μια κλήση για να strcmp φαίνεται. 226 00:10:54,160 --> 00:10:58,530 Χτύπησα n, και στην πραγματικότητα, έχω πάρει το μήνυμα, πρόγραμμα αυτό ολοκληρώθηκε με SIGSEGV σήμα 227 00:10:58,530 --> 00:11:01,370 τμηματοποίηση σφάλμα. Έτσι τώρα Εγώ πραγματικά έχουν παραβιαστεί SEG, 228 00:11:01,370 --> 00:11:06,479 και το πρόγραμμα μου έχει αρκετά πολύ αποτελεσματικά παραιτηθεί. 229 00:11:06,479 --> 00:11:07,770 Αυτό είναι το τέλος του προγράμματος. 230 00:11:07,770 --> 00:11:10,370 Χάλασε, συνετρίβη. 231 00:11:10,370 --> 00:11:14,740 Έτσι, δεν ήταν πολλά, αλλά εγώ όντως να μάθουν αρκετά 232 00:11:14,740 --> 00:11:16,747 από αυτή την μικρή εμπειρία. 233 00:11:16,747 --> 00:11:17,580 Τι έμαθα; 234 00:11:17,580 --> 00:11:22,020 Λοιπόν, το πρόγραμμά μου κολλάει λίγο πολύ αμέσως. 235 00:11:22,020 --> 00:11:26,300 Το πρόγραμμά μου κολλάει σε Μια κλήση για strcmp, αλλά εγώ 236 00:11:26,300 --> 00:11:30,560 δεν έχουν τοπικές μεταβλητές στο μου προγράμματος κατά το χρόνο που συντρίβει. 237 00:11:30,560 --> 00:11:37,320 Λοιπόν, τι string, ή χορδές, θα μπορούσα ενδεχομένως να συγκρίνει. 238 00:11:37,320 --> 00:11:42,140 Αν δεν έχω κανένα τοπικό μεταβλητές, ίσως 239 00:11:42,140 --> 00:11:45,520 υποθέσουμε ότι have-- εκεί ίσως είναι καθολική μεταβλητή, η οποία θα μπορούσε να είναι αλήθεια. 240 00:11:45,520 --> 00:11:47,670 >> Αλλά γενικά, φαίνεται σαν να είμαι συγκρίνοντας 241 00:11:47,670 --> 00:11:52,070 σε κάτι που δεν υπάρχει. 242 00:11:52,070 --> 00:11:54,130 Ας διερευνήσει ότι λίγο πιο πέρα. 243 00:11:54,130 --> 00:11:55,120 Έτσι, Πάω να καθαρίσετε την οθόνη μου. 244 00:11:55,120 --> 00:11:57,536 Πάω να βγείτε από το GDB περιβάλλον για ένα δευτερόλεπτο. 245 00:11:57,536 --> 00:12:01,300 Και σκέφτομαι, εντάξει, έτσι υπάρχει δεν υπάρχουν τοπικές μεταβλητές στο πρόγραμμα μου. 246 00:12:01,300 --> 00:12:06,444 Αναρωτιέμαι αν ίσως είμαι υποτίθεται ότι πρέπει να περάσει σε μια σειρά ως όρισμα γραμμής εντολών. 247 00:12:06,444 --> 00:12:07,610 Οπότε ας δοκιμάσουν αυτό έξω. 248 00:12:07,610 --> 00:12:09,020 Δεν έχω ξανακάνει. 249 00:12:09,020 --> 00:12:14,244 >> Ας δούμε αν ίσως αν έχω τρέξει αυτό το πρόγραμμα με το επιχείρημα της γραμμής εντολών λειτουργεί. 250 00:12:14,244 --> 00:12:16,140 Εεε, δεν υπάρχει σφάλμα κατάτμησης. 251 00:12:16,140 --> 00:12:17,870 Μου είπε απλά ότι έχω καταλάβει. 252 00:12:17,870 --> 00:12:19,170 Έτσι, ίσως αυτή είναι η λύση εδώ. 253 00:12:19,170 --> 00:12:27,560 Και πράγματι, αν πάω πίσω και να δούμε η πραγματική πηγαίο κώδικα για buggy1.c, 254 00:12:27,560 --> 00:12:31,180 φαίνεται σαν αυτό που κάνω είναι Κάνω μια κλήση για να strcmp χωρίς 255 00:12:31,180 --> 00:12:34,010 ελέγχει εάν πράγματι argv [1] υπάρχει. 256 00:12:34,010 --> 00:12:36,730 Αυτό είναι στην πραγματικότητα ο πηγαίο κώδικα για buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Έτσι, αυτό που πραγματικά πρέπει να κάνουμε εδώ για να διορθώσετε το πρόγραμμά μου, 258 00:12:38,855 --> 00:12:40,835 υποθέτοντας ότι έχω το αρχείο μπροστά μου, είναι 259 00:12:40,835 --> 00:12:44,740 για να προσθέσετε απλά μια επιταγή για να κάνει βεβαιωθείτε ότι argc είναι ίση με 2. 260 00:12:44,740 --> 00:12:47,780 Έτσι, αυτό το παράδειγμα, και πάλι, όπως είπα, Είναι λίγο σκηνοθετημένη, σωστά; 261 00:12:47,780 --> 00:12:49,840 Είσαι γενικά δεν πρόκειται να διαγράψετε κατά λάθος τον πηγαίο κώδικα 262 00:12:49,840 --> 00:12:51,820 και στη συνέχεια πρέπει να δοκιμάσετε και να διορθώσετε το πρόγραμμα. 263 00:12:51,820 --> 00:12:53,120 Αλλά ελπίζω, έδωσε σας μια απεικόνιση 264 00:12:53,120 --> 00:12:55,120 από τα είδη των πραγμάτων που θα μπορούσατε να σκεφτόμαστε 265 00:12:55,120 --> 00:12:56,610 όπως εσείς την αποσφαλμάτωση του προγράμματος σας. 266 00:12:56,610 --> 00:12:58,760 >> Ποια είναι η κατάσταση εδώ; 267 00:12:58,760 --> 00:13:00,510 Τι μπορώ να κάνω μεταβλητές έχουν πρόσβαση σε μένα; 268 00:13:00,510 --> 00:13:03,600 Πού ακριβώς είναι το πρόγραμμά μου συντρίβοντας, σε ποια γραμμή, 269 00:13:03,600 --> 00:13:05,240 Σε ποια κλήση σε ποιο λειτουργία; 270 00:13:05,240 --> 00:13:06,952 Τι είδους ενδείξεις μήπως αυτό να μου δώσει; 271 00:13:06,952 --> 00:13:08,910 Και αυτό είναι ακριβώς η το είδος της νοοτροπίας που εσείς 272 00:13:08,910 --> 00:13:12,820 θα πρέπει να μπουν όταν είστε σκεφτόμαστε εντοπισμό σφαλμάτων σε προγράμματα σας. 273 00:13:12,820 --> 00:13:13,820 >> Είμαι ο Νταγκ Lloyd. 274 00:13:13,820 --> 00:13:16,140 Αυτό είναι CS50. 275 00:13:16,140 --> 00:15:08,642