>> DOUG LLOYD: Εντάξει GDB.
Τι είναι αυτό ακριβώς;
Έτσι GDB, η οποία βρίσκεται για το GNU Debugger,
είναι ένα πραγματικά φοβερό εργαλείο που μπορούμε να χρησιμοποιούμε για να μας βοηθήσει στον εντοπισμό σφαλμάτων προγράμματα μας,
ή να βρείτε πού είναι τα πράγματα πάει καλά στα προγράμματά μας.
GDB είναι εκπληκτικά ισχυρό, αλλά η έξοδος και η αλληλεπίδραση με αυτό
μπορεί να είναι λίγο αινιγματικά.
Είναι συνήθως ένα εργαλείο γραμμής εντολών, και μπορεί να ρίξει πολλά μηνύματα σε σας.
Και μπορεί κάπως δύσκολο να αναλύσει ακριβώς τι συμβαίνει.
Ευτυχώς, έχουμε λάβει μέτρα για να διορθώσετε αυτό το πρόβλημα για εσάς
καθώς εργάζεστε με CS50.
Εάν δεν χρησιμοποιείτε το γραφικό εντοπισμού σφαλμάτων, το οποίο ο συνάδελφός μου ο Dan
Armandarse έχει μιλήσει αρκετά ένα κομμάτι περίπου σε ένα βίντεο που
θα πρέπει να είναι εδώ αυτή τη στιγμή, μπορεί να χρειαστείτε
Για να χρησιμοποιήσετε αυτές γραμμής εντολών εργαλεία για να συνεργαστεί με το GDB.
Εάν εργάζεστε στο CS50 IDE, δεν χρειάζεται να το κάνουμε αυτό.
Αλλά αν δεν είστε εργάζονται στο CS50 IDE,
ίσως χρησιμοποιείτε μια έκδοση του CS50 Appliance,
ή άλλο Linux λειτουργικό Σύστημα με GDB τοποθετημένη σε αυτό,
μπορεί να χρειαστεί να χρησιμοποιήσουν Αυτά τα εργαλεία της γραμμής εντολών.
>> Και επειδή ίσως Πρέπει να το κάνουμε αυτό, είναι
χρήσιμο μόνο για να καταλάβουμε πώς GDB λειτουργεί από τη γραμμή εντολών.
Αλλά και πάλι, αν είστε χρησιμοποιώντας το IDE CS50, που
μπορούν να χρησιμοποιήσουν το γραφικό πρόγραμμα εντοπισμού σφαλμάτων που είναι χτισμένη μέσα στο IDE.
Έτσι για να πάρετε τα πράγματα πηγαίνουν με GDB, για να ξεκινήσει η αποσφαλμάτωση
διαδικασία ενός συγκεκριμένου πρόγραμμα, το μόνο που χρειάζεται να κάνετε
είναι ο τύπος που ακολουθείται GDB από το όνομα του προγράμματος.
Έτσι, για παράδειγμα, αν το πρόγραμμά σας είναι Γεια σας, πρέπει να πληκτρολογήσετε GDB γεια.
>> Όταν το κάνετε αυτό, θα πάμε να σηκώσει το περιβάλλον GDB.
Έγκαιρη σας θα αλλάξει, και αντί να είναι ό, τι συνήθως
είναι όταν πληκτρολογείτε τα πράγματα στις line-- εντολή ls,
cd-- όλα τα τυπικά σας Εντολές του Linux, προτροπή σας
θα αλλάξει σε, μάλλον, κάτι όπως παρενθέσεις GDB παρενθέσεις.
Αυτό είναι νέο προτροπή GDB σας, επειδή είστε μέσα στο περιβάλλον GDB.
Μόλις στο εσωτερικό του εν λόγω περιβάλλοντος, υπάρχουν δύο μεγάλες εντολές
ότι θα πρέπει πιθανώς να χρησιμοποιήσετε με την ακόλουθη σειρά.
>> Η πρώτη είναι η Β, η οποία είναι μικρή για διάλειμμα.
Και μετά την πληκτρολόγηση β, που συνήθως πληκτρολογήστε το όνομα της συνάρτησης,
ή αν τυχαίνει να γνωρίζω γύρω από αυτό τον αριθμό γραμμής
το πρόγραμμά σας έχει αρχίσει να συμπεριφέρεται λίγο παράξενα,
μπορείτε να πληκτρολογήσετε μια γραμμή Αριθμός εκεί.
Ποια β, ή να σπάσει, δεν είναι ότι επιτρέπει το πρόγραμμά σας
να τρέχει μέχρι ένα ορισμένο σημείο, δηλαδή, το όνομα της συνάρτησης
να καθορίσετε ή η γραμμή αριθμό που εσείς καθορίζετε.
>> Και στο σημείο αυτό, θα παγώσει την εκτέλεση.
Αυτό είναι ένα πολύ καλό πράγμα, επειδή μια φορά η εκτέλεση έχει παγώσει,
μπορείτε να αρχίσετε να πολύ αργά βήμα μέσα από το πρόγραμμά σας.
Συνήθως, αν έχετε τρέξιμο προγράμματά σας, είναι αρκετά μικρή.
Συνήθως, πληκτρολογείτε dot κάθετος ανεξαρτήτως το όνομα του προγράμματος σας, πατήστε Enter,
και για να μπορέσετε να αναβοσβήνει, σας το πρόγραμμα έχει ήδη τελειώσει.
Δεν είναι πραγματικά πολύ χρόνο για να δοκιμάσετε και να καταλάβω τι συμβαίνει λάθος.
Γι 'αυτό πραγματικά να είναι σε θέση να επιβραδύνει τα πράγματα ρυθμίζοντας το σημείο καμπής με β,
και στη συνέχεια να πατήσουν.
>> Στη συνέχεια, αφού έχετε ρυθμίσει το διάλειμμά σας σημείο, μπορείτε να εκτελέσετε το πρόγραμμα.
Και αν έχετε οποιαδήποτε επιχειρήματα της γραμμής εντολών,
μπορείτε να καθορίσετε εδώ, όχι όταν πληκτρολογείτε GDB όνομα του προγράμματός σας.
Μπορείτε να καθορίσετε το σύνολο της γραμμής εντολών επιχειρήματα με τη λήψη r, ή να τρέξει,
και, στη συνέχεια, τα επιχειρήματα της γραμμής εντολών ανεξαρτήτως θα πρέπει να έχετε στο εσωτερικό του προγράμματός σας.
Υπάρχουν ένας αριθμός άλλων πραγματικά σημαντικές και χρήσιμες εντολές
εντός του περιβάλλοντος του ΑΕΠ.
Έτσι, επιτρέψτε μου να γρήγορα πάει πάνω από μερικά από αυτά.
>> Το πρώτο είναι η, η οποία είναι μικρή για την επόμενη, και μπορείτε να πληκτρολογήσετε την επόμενη αντί της Ν,
τόσο θα μπορούσε να λειτουργήσει.
Και αυτό είναι μόνο η στενογραφία.
Και όπως έχετε πιθανώς ήδη πάρει χρησιμοποιείται για να, να είναι σε θέση να πληκτρολογήσετε τα πράγματα
μικρότερη είναι γενικά καλύτερα.
Και τι θα κάνουμε είναι ότι θα βήμα προς τα εμπρός ένα μπλοκ του κώδικα.
Γι 'αυτό θα προχωρήσουμε προς τα εμπρός μέχρι μια κλήση συνάρτησης.
Και στη συνέχεια, αντί του καταδύσεις σε αυτή την λειτουργία
και να περάσει από όλα αυτά λειτουργίες κώδικα, θα έχει απλά τη λειτουργία.
>> Η λειτουργία αυτή θα πρέπει να ονομάζεται.
Θα κάνουμε ό, τι είναι το έργο της.
Θα επιστρέψει μια τιμή στο η λειτουργία που ζητούσε.
Και τότε θα προχωρήσουμε στην επόμενη γραμμή αυτής της λειτουργίας κλήσης.
Αν θέλετε να το βήμα εντός της συνάρτησης,
και όχι μόνο με το εκτελέσει, ειδικά
αν νομίζετε ότι το πρόβλημα μπορεί να βρίσκονται στο εσωτερικό αυτής της λειτουργίας,
θα μπορούσε, φυσικά, ορίστε ένα διάλειμμα σημείο εντός αυτής της λειτουργίας.
Ή αν είστε ήδη σε λειτουργία, μπορείτε να Χρησιμοποιήστε το S για βήμα προς τα εμπρός μία γραμμή κώδικα.
>> Έτσι, αυτό θα παρέμβουν και να βουτήξει λειτουργίες,
αντί να έχουν ακριβώς το εκτελέσει και συνεχίζοντας σε λειτουργία
ότι είστε μέσα για τον εντοπισμό σφαλμάτων.
Αν ποτέ θέλετε να ξέρετε η τιμή μιας μεταβλητής,
μπορείτε να πληκτρολογήσετε p, ή εκτύπωσης, και στη συνέχεια το όνομα της μεταβλητής.
Και αυτό θα εκτυπώσετε σε εσάς, στο εσωτερικό του περιβάλλοντος GDB,
το όνομα της μεταβλητής, ότι you-- δικαιολογία me-- την τιμή της μεταβλητής
ότι έχετε το όνομα.
Αν θέλετε να μάθετε τις τιμές του κάθε τοπική μεταβλητή προσβάσιμο από όπου
Αυτήν τη στιγμή είναι στο σας το πρόγραμμα, μπορείτε να πληκτρολογήσετε πληροφορίες ντόπιους.
Είναι πολύ πιο γρήγορα από ό, τι πατώντας p και στη συνέχεια ό,
λίστα από όλα τα μεταβλητές που ξέρετε υπάρχουν.
Μπορείτε να πληκτρολογήσετε πληροφορίες ντόπιους, και θα εκτυπώνει τα πάντα για σένα.
Επόμενο είναι η BT, η οποία είναι σύντομη για την Επιστροφή Trace.
Τώρα, γενικά, ιδιαίτερα στην αρχή της CS50,
δεν θα έχουν πραγματικά την ευκαιρία να χρησιμοποιήσει BT, ή Πίσω Trace,
επειδή δεν είστε έχοντας λειτουργίες ότι καλούν άλλες λειτουργίες.
>> Μπορεί να έχετε μια κύρια πρόσκληση λειτουργία, αλλά αυτό είναι πιθανώς.
Δεν έχουν αυτό το άλλο λειτουργία καλώντας άλλη λειτουργία, η οποία
καλεί μια άλλη λειτουργία, και ούτω καθεξής.
Αλλά, όπως τα προγράμματα σας να πάρετε περισσότερα πολύπλοκη, και ειδικότερα
όταν αρχίσουν να εργάζονται με αναδρομή, πίσω ίχνος
μπορεί να είναι ένα πραγματικά χρήσιμο τρόπο για να αφήσετε είδος πάρει κάποιο πλαίσιο για το πού
Είμαι στο πρόγραμμα μου.
Έτσι λένε έχετε γράψει τον κωδικό σας, και Γνωρίζετε ότι ο κύριος καλεί μια συνάρτηση
στ, η οποία καλεί μια συνάρτηση g, το οποίο καλεί μια συνάρτηση h.
Έτσι έχουμε πολλές στρώσεις της ένθεσης συμβαίνει εδώ.
>> Αν είστε μέσα του GDB το περιβάλλον σας,
και ξέρετε μέσα σας του h, αλλά ξεχάσετε
σχετικά με το τι έχεις εκεί που are-- μπορείτε να πληκτρολογήσετε BT, ή πίσω ίχνος,
και θα εκτυπώσει h, g, f κύρια, μαζί με κάποιες άλλες πληροφορίες, οι οποίες
σας δίνει μια ένδειξη ότι, εντάξει κύρια ονομάζονται f, f ονομάζεται g, g ονομάζεται h,
και αυτό είναι όπου σήμερα είμαι στο πρόγραμμά μου.
Έτσι, μπορεί να είναι πραγματικά χρήσιμη, ιδιαίτερα καθώς η κρυπτική-κότητας της GDB
γίνεται λίγο συντριπτική, για να μάθετε πού ακριβώς είναι τα πράγματα.
Τέλος, όταν το πρόγραμμά σας γίνεται, ή όταν τελειώσετε το debugging
και θέλετε να απομακρυνθείτε από το περιβάλλον GDB,
βοηθά να ξέρει πώς να βγούμε από αυτό.
Μπορείτε να πληκτρολογήσετε q, ή Έξοδος, να βγούμε.
Τώρα, πριν από τη σημερινή βίντεο Έχω ετοιμάσει ένα πρόγραμμα με λάθη
που ονομάζεται buggy1, η οποία θα συντάξει από ένα αρχείο γνωστό ως buggy1.c.
Όπως μπορείτε να φανταστείτε, αυτό το πρόγραμμα είναι πράγματι προβληματικό.
Κάτι πάει στραβά όταν προσπαθώ και να το εκτελέσετε.
Τώρα, δυστυχώς, έχω λάθος διαγραμμένο αρχείο buggy1.c μου,
έτσι ώστε για μένα να καταλάβω τι πηγαίνει στραβά με αυτό το πρόγραμμα,
Πάω να πρέπει να χρησιμοποιήσετε GDB είδους τυφλά, προσπαθώντας
για να περιηγηθείτε μέσα από αυτό το πρόγραμμα για την καταλάβουμε ακριβώς τι πηγαίνει στραβά.
Αλλά χρησιμοποιώντας μόνο τα εργαλεία έχουμε ήδη μάθει για,
μπορούμε λίγο πολύ εικόνα τι ακριβώς είναι.
Οπότε ας το κεφάλι πάνω σε CS50 IDE και ρίξτε μια ματιά.
Εντάξει, έτσι είμαστε εδώ μου CS50 IDE περιβάλλον,
και θα κάνετε ζουμ σε λίγο ώστε να μπορείτε να δείτε λίγο περισσότερο.
Στο παράθυρο τερματικού μου, αν μπορώ λίστα το περιεχόμενο του σημερινού διευθυντή μου
με ls, θα δούμε ότι εγώ έχουν ένα ζευγάρι από τα αρχεία πηγής
εδώ, συμπεριλαμβανομένης της συζητήθηκαν προηγουμένως buggy1.
Τι συμβαίνει ακριβώς όταν Προσπαθώ και να τρέξει buggy1.
Λοιπόν ας μάθουμε.
Τύπου Ι dot κάθετος, λάθη, και εγώ πατήστε Enter.
>> Τμηματοποίηση ρηγμάτων.
Αυτό δεν είναι καλό.
Αν θυμάστε, ένα τμηματοποίηση βλάβη συνήθως
συμβαίνει όταν έχουμε πρόσβαση στη μνήμη ότι δεν είμαστε επιτρέπεται να αγγίξει.
Έχουμε φτάσει με κάποιο τρόπο έξω από τα όρια
τι το πρόγραμμα, η compiler, μας έχει δώσει.
Και έτσι αυτό είναι ήδη μια ιδέα να κρατήσει στην εργαλειοθήκη
όπως έχουμε ξεκινήσει η διαδικασία εντοπισμού σφαλμάτων.
Κάτι έχει πάει λίγο στραβά εδώ.
>> Εντάξει, οπότε ας ξεκινήσουμε μέχρι το περιβάλλον GDB
και να δούμε αν μπορούμε να καταλάβουμε τι ακριβώς είναι το πρόβλημα.
Πάω για να καθαρίσετε την οθόνη μου, και Πάω να πληκτρολογήσετε GDB
και πάλι, να εισέλθουν στο περιβάλλον GDB, και το όνομα του προγράμματος
ότι θέλετε να διορθώσετε, buggy1.
Παίρνουμε ένα μικρό μήνυμα, διαβάζοντας σύμβολα από buggy1, έγινε.
Το μόνο που σημαίνει είναι ότι τράβηξε μαζί ολόκληρος ο κώδικας,
και τώρα είναι ήδη φορτωθεί σε GDB, και είναι έτοιμα να ξεκινήσουν.
>> Τώρα, τι θέλω να κάνω;
Θυμάστε τι το το πρώτο βήμα είναι τυπικά
αφού είμαι μέσα του αυτό το περιβάλλον;
Ας ελπίσουμε ότι, το εν λόγω σύνολο ένα σημείο καμπής, διότι
Στην πραγματικότητα αυτό είναι ό, τι θέλω να κάνω.
Τώρα, δεν έχω το πηγαίο κώδικα για αυτό
μπροστά μου, το οποίο είναι πιθανώς δεν είναι η τυπική περίπτωση χρήσης, από τον τρόπο.
Μάλλον θα.
Έτσι, αυτό είναι καλό.
Αλλά υποθέτοντας δεν το κάνετε, ό, τι είναι η μία λειτουργία που ξέρετε
υπάρχει σε κάθε πρόγραμμα C;
Δεν έχει σημασία πόσο μεγάλο ή πολύπλοκο είναι, σίγουρα υπάρχει αυτή η λειτουργία.
Κύρια, σωστά;
>> Έτσι, παραλείποντας όλα τα άλλα, μπορούμε να ορίσετε ένα σημείο καμπής στην κύρια.
Και πάλι, θα μπορούσα απλά πληκτρολογήστε σπάσει κύριο, αντί της β.
Και αν είστε περίεργοι, αν ποτέ πληκτρολογήστε έναν μακρύ εντολή
και στη συνέχεια να συνειδητοποιήσουν ότι πληκτρολογήσει το λάθος πράγμα,
και θέλετε να ξεφορτωθείτε όλα όπως έκανα ακριβώς,
μπορείτε να πάρετε τον έλεγχο U, το οποίο θα διαγράψει τα πάντα και να σας φέρει πίσω
στην αρχή των γραμμών δρομέα.
Μια πολύ πιο γρήγορα από ό, τι ακριβώς κρατήστε πατημένο το πλήκτρο διαγράψετε, ή χτυπώντας το ένα μάτσο φορές
πάνω.
>> Έτσι θα ορίσετε ένα σημείο καμπής στην κύρια.
Και όπως μπορείτε να δείτε, λέει έχουμε ορίσετε ένα σημείο καμπής στο αρχείο buggy1.c,
και προφανώς η πρώτη γραμμή του κώδικα της κύριας γραμμής είναι επτά.
Και πάλι, δεν έχουμε το αρχείο προέλευσης εδώ,
αλλά εγώ θα υποθέσουμε ότι είναι να μου λέει την αλήθεια.
Και στη συνέχεια, απλώς προσπαθώ και εκτελέστε το πρόγραμμα, r.
Ξεκινώντας το πρόγραμμα.
Εντάξει, έτσι ώστε αυτό το μήνυμα είναι ένα μικρό κρυπτικό.
Αλλά βασικά τι είναι συμβαίνει εδώ είναι ότι είναι απλά
λέγοντάς μου ότι έχω χτυπήσει διάλειμμα μου σημείο, διάλειμμα αριθμό σημείου 1.
>> Και στη συνέχεια, ότι η γραμμή του κώδικα, Δεν υπάρχει τέτοιο αρχείο ή κατάλογος.
Ο μόνος λόγος για τον οποίο Βλέπω το μήνυμα
Είναι επειδή κατά λάθος διαγράφεται buggy.c το αρχείο μου.
Αν buggy1.c αρχείο μου υπήρχε στον τρέχοντα κατάλογο,
ότι το δικαίωμα γραμμή θα υπάρχει πραγματικά πες μου ποια είναι η γραμμή κώδικα
κυριολεκτικά διαβάζει.
Δυστυχώς, αυτό διαγράφεται.
Εμείς πάμε για να πλοηγηθείτε είδος του μέσω αυτής λίγο περισσότερο στα τυφλά.
>> ΟΚ, οπότε ας δούμε, τι δεν θέλω να κάνω εδώ;
Λοιπόν, θα ήθελα να ξέρω τι τοπικών μεταβλητές ίσως είναι στη διάθεσή μου.
Έχω αρχίσει το πρόγραμμά μου.
Ας δούμε τι θα μπορούσε να είναι έχουν ήδη προετοιμαστεί για εμάς.
Τύπου Ι Πληροφορίες ντόπιους, δεν τους ντόπιους.
Εντάξει, έτσι ώστε να μην να μου δώσει έναν τόνο των πληροφοριών.
Θα μπορούσα να προσπαθήσω και να εκτυπώσετε μια μεταβλητή, αλλά δεν ξέρω κανένα ονόματα των μεταβλητών.
Θα μπορούσατε να δοκιμάσετε ένα ίχνος πίσω, αλλά είμαι μέσα της κύριας,
έτσι ξέρω δεν έχω κάνει μια άλλη κλήση της συνάρτησης τώρα.
>> Έτσι μοιάζει μόνο οι επιλογές μου είναι για χρήση n ή έτσι και να αρχίσουν να βουτήξει μέσα.
Πάω να χρησιμοποιήσετε n.
Γι 'αυτό και τύπου n.
Θεέ μου, τι συμβαίνει εδώ.
Πρόγραμμα λαμβανόμενα σήματα, SIGSEGV τμηματοποίηση σφάλμα,
και στη συνέχεια ένα σωρό πράγματα.
Είμαι ήδη κυριεύσει.
Λοιπόν, υπάρχει πράγματι μια πολλά που πρέπει να μάθει εδώ.
Έτσι τι μας λέει αυτό;
Τι μας λέει είναι, αυτό το πρόγραμμα είναι περίπου, αλλά δεν έχει ακόμη, SEG σφάλμα.
Και συγκεκριμένα, θα πάω για να μεγεθύνετε ακόμη περισσότερο εδώ,
είναι έτοιμος να SEG σφάλμα περίπου κάτι που ονομάζεται strcmp.
>> Τώρα, μπορεί να μην έχουμε συζητήθηκαν Αυτή η λειτουργία εκτενώς.
Αλλά is-- επειδή εμείς δεν πρόκειται για να μιλήσουμε για κάθε λειτουργία που
υπάρχει στο πρότυπο C library-- αλλά είναι όλα στη διάθεσή σας,
ιδιαίτερα εάν παίρνετε ένα δείτε reference.cs50.net.
Και strcmp είναι ένα πραγματικά ισχυρό λειτουργία που υπάρχει μέσα
της string.h επικεφαλίδα αρχείο, το οποίο είναι μια κεφαλίδα
αρχείο που είναι αφιερωμένο στις λειτουργίες ότι η εργασία με χορδές και να χειριστούν.
>> Και κυρίως, τι κάνει είναι strcmp συγκρίνει τις τιμές των δύο χορδές.
Έτσι είμαι έτοιμος σε κατακερματισμό της βλάβης σε μια κλήση για να strcmp φαίνεται.
Χτύπησα n, και στην πραγματικότητα, έχω πάρει το μήνυμα, πρόγραμμα αυτό ολοκληρώθηκε με SIGSEGV σήμα
τμηματοποίηση σφάλμα. Έτσι τώρα Εγώ πραγματικά έχουν παραβιαστεί SEG,
και το πρόγραμμα μου έχει αρκετά πολύ αποτελεσματικά παραιτηθεί.
Αυτό είναι το τέλος του προγράμματος.
Χάλασε, συνετρίβη.
Έτσι, δεν ήταν πολλά, αλλά εγώ όντως να μάθουν αρκετά
από αυτή την μικρή εμπειρία.
Τι έμαθα;
Λοιπόν, το πρόγραμμά μου κολλάει λίγο πολύ αμέσως.
Το πρόγραμμά μου κολλάει σε Μια κλήση για strcmp, αλλά εγώ
δεν έχουν τοπικές μεταβλητές στο μου προγράμματος κατά το χρόνο που συντρίβει.
Λοιπόν, τι string, ή χορδές, θα μπορούσα ενδεχομένως να συγκρίνει.
Αν δεν έχω κανένα τοπικό μεταβλητές, ίσως
υποθέσουμε ότι have-- εκεί ίσως είναι καθολική μεταβλητή, η οποία θα μπορούσε να είναι αλήθεια.
>> Αλλά γενικά, φαίνεται σαν να είμαι συγκρίνοντας
σε κάτι που δεν υπάρχει.
Ας διερευνήσει ότι λίγο πιο πέρα.
Έτσι, Πάω να καθαρίσετε την οθόνη μου.
Πάω να βγείτε από το GDB περιβάλλον για ένα δευτερόλεπτο.
Και σκέφτομαι, εντάξει, έτσι υπάρχει δεν υπάρχουν τοπικές μεταβλητές στο πρόγραμμα μου.
Αναρωτιέμαι αν ίσως είμαι υποτίθεται ότι πρέπει να περάσει σε μια σειρά ως όρισμα γραμμής εντολών.
Οπότε ας δοκιμάσουν αυτό έξω.
Δεν έχω ξανακάνει.
>> Ας δούμε αν ίσως αν έχω τρέξει αυτό το πρόγραμμα με το επιχείρημα της γραμμής εντολών λειτουργεί.
Εεε, δεν υπάρχει σφάλμα κατάτμησης.
Μου είπε απλά ότι έχω καταλάβει.
Έτσι, ίσως αυτή είναι η λύση εδώ.
Και πράγματι, αν πάω πίσω και να δούμε η πραγματική πηγαίο κώδικα για buggy1.c,
φαίνεται σαν αυτό που κάνω είναι Κάνω μια κλήση για να strcmp χωρίς
ελέγχει εάν πράγματι argv [1] υπάρχει.
Αυτό είναι στην πραγματικότητα ο πηγαίο κώδικα για buggy1.c.
Έτσι, αυτό που πραγματικά πρέπει να κάνουμε εδώ για να διορθώσετε το πρόγραμμά μου,
υποθέτοντας ότι έχω το αρχείο μπροστά μου, είναι
για να προσθέσετε απλά μια επιταγή για να κάνει βεβαιωθείτε ότι argc είναι ίση με 2.
Έτσι, αυτό το παράδειγμα, και πάλι, όπως είπα, Είναι λίγο σκηνοθετημένη, σωστά;
Είσαι γενικά δεν πρόκειται να διαγράψετε κατά λάθος τον πηγαίο κώδικα
και στη συνέχεια πρέπει να δοκιμάσετε και να διορθώσετε το πρόγραμμα.
Αλλά ελπίζω, έδωσε σας μια απεικόνιση
από τα είδη των πραγμάτων που θα μπορούσατε να σκεφτόμαστε
όπως εσείς την αποσφαλμάτωση του προγράμματος σας.
>> Ποια είναι η κατάσταση εδώ;
Τι μπορώ να κάνω μεταβλητές έχουν πρόσβαση σε μένα;
Πού ακριβώς είναι το πρόγραμμά μου συντρίβοντας, σε ποια γραμμή,
Σε ποια κλήση σε ποιο λειτουργία;
Τι είδους ενδείξεις μήπως αυτό να μου δώσει;
Και αυτό είναι ακριβώς η το είδος της νοοτροπίας που εσείς
θα πρέπει να μπουν όταν είστε σκεφτόμαστε εντοπισμό σφαλμάτων σε προγράμματα σας.
>> Είμαι ο Νταγκ Lloyd.
Αυτό είναι CS50.