[? DAN ARMADARAS:?] Γεια σου, Είμαι [? Dan Armadaras;]. Σήμερα, θα πάμε να να κοιτάζει τον εντοπισμό σφαλμάτων. Όχι μόνο δεν έχουμε την ευκαιρία να μιλήσουμε για κάποιες τεχνικές, αλλά επίσης θα πάμε να δούμε μερικά από τα χαρακτηριστικά που περιέχονται εντός του IDE CS50 που επιτρέπουν σας για να διορθώσετε εύκολα ένα πρόγραμμα. Μόνο ένα παράδειγμα κάτι που μπορεί να πάει στραβά και είναι πραγματικά κάτι ότι έχουμε ήδη δει πριν. Σε αυτήν την περίπτωση, αυτό είναι ένα πρόγραμμα C ότι δέχεται έναν ακέραιο από το χρήστη, χωρίζει από δύο, και παρέχει η έξοδος πίσω στο χρήστη. Τώρα, από ό, τι έχουμε δει νωρίτερα σε διαλέξεις, γνωρίζουμε ότι αυτό πράγματι θα προκαλέσει συγκεκριμένους τύπους προβλημάτων διαίρεσης όταν έχουμε μονούς αριθμούς. Συγκεκριμένα, θα ρίξει λίγο μακριά τίποτα μετά την υποδιαστολή. Τώρα, γνωρίζουμε ότι αυτή η συμβαίνει να είναι η περίπτωση. Και αν το τρέξει, μπορούμε να επιβεβαιώσουμε υποψίες μας, πρώτον, με την κατάρτιση. Και στη συνέχεια, με το τρέξιμο και εισάγοντας ένα μονό αριθμό. Αυτό δεν είναι κάτι νέο. Αλλά αυτό είναι στην πραγματικότητα μια παράδειγμα ένα σφάλμα που μπορεί να υπάρχει μέσα σε ένα ευρύτερο πρόγραμμα ότι γίνεται πιο δύσκολο να εντοπίσουμε. Ακόμα κι αν ξέρουμε ποιο είναι το θέμα είναι η αληθινή ουσία του θέματος θα μπορούσε να προσπαθούν να εντοπίσουν Ειδικότερα, όπου παρουσιάζεται το σφάλμα, προσδιορίζοντας τι αυτό το πρόβλημα είναι, και στη συνέχεια για τον καθορισμό. Έτσι, παρέχει ως παράδειγμα για το τι θα μπορούσε να είναι κάτι ότι γνωρίζουμε ήδη, αλλά μπορεί να θαφτεί σε άλλα στοιχεία του κώδικα. Έτσι, το άνοιγμα αυτό άλλη πηγή κωδικός αρχείου ως παράδειγμα, Αυτό το πρόβλημα διαίρεσης είναι τώρα μέρος ενός μεγαλύτερου προγράμματος. Ακόμα θα μπορούσε να είναι λίγο λίγο σκηνοθετημένη, και εμείς να είναι σε θέση να εύκολα το αναγνωρίσει, ιδίως δεδομένου ότι είμαστε ακριβώς συζητάμε αυτό. Αλλά μπορούμε να καταλάβουμε ότι αυτή η το πρόβλημα μπορεί να υπάρχει σε μεγαλύτερη κλίμακα. Αν έχω συντάξει αυτό και τώρα να τρέξει, εισάγετε ένα περιττό αριθμό, μπορούμε να δούμε ότι δεν έχουμε ακριβώς η έξοδος που μπορεί να έχουμε αναμένεται. Στη συγκεκριμένη περίπτωση, θα μπορούσαμε να πούμε ότι θέλετε να μετρήσετε όλους τους αριθμούς από ένα μέχρι κάποιο συγκεκριμένο αριθμό. Και μπορούμε να δούμε ότι έχουν μια ποικιλία θεμάτων εδώ αν είμαστε έξοδο, απλά, 0 και 1 όταν θα διαθέτει μια είσοδο 5. Έτσι, γνωρίζουμε ήδη ότι υπάρχει ένα πρόβλημα εδώ. Αλλά δεν μπορούμε να γνωρίζουμε με ακρίβεια όπου αυτό το ζήτημα υπάρχει στην πραγματικότητα. Τώρα, ένας από τους τρόπους που μπορούμε να προσπαθήσουμε να το διορθώσω αυτό Είναι κάτι που έχουμε ήδη εισαχθεί. Μπορούμε να το χρησιμοποιήσετε μόνο σε μεγαλύτερη κλίμακα. Στη γραμμή 14, έχουμε Αυτή η λειτουργία printf, η οποία μας επιτρέπει να εκτυπώσετε την κατάσταση από διάφορα κομμάτια των πληροφοριών. Και αυτό είναι κάτι που θα θα πρέπει να αξιοποιήσει στο πλαίσιο του προγράμματος σας να προσπαθήσουμε να καταλάβουμε τι ακριβώς είναι συμβαίνει σε διάφορες γραμμές κώδικα. Έτσι, ακόμη και αν αυτή δεν είναι η τελικό αποτέλεσμα που έχουμε στην πραγματικότητα θέλουν να παράγουν από Το πρόγραμμα αυτό, έχουμε ακόμα μπορεί να έχουν κάποια εντοπισμού σφαλμάτων καταστάσεων όπου να προσπαθώ να καταλάβω τι ακριβώς συμβαίνει στο εσωτερικό του κώδικά μας. Έτσι, σε αυτή την περίπτωση, θα το κάνω printf με την ετικέτα εντοπισμού σφαλμάτων. Σε αυτήν την περίπτωση, αυτό είναι μόνο ένα debug εγχόρδων ότι είμαι up-θέτοντας έτσι ώστε να καταστεί πολύ σαφής στην έξοδο του κωδικού μου τι είναι αυτό που θέλω να δείξω. Και εδώ έξοδο ο αριθμός ότι έχουμε υπολογιστεί. Στην περίπτωση αυτή, θα ήθελα να θέλουν να γνωρίζουν με ακρίβεια τι συμβαίνει πριν και μετά από κάποιο συγκεκριμένο υπολογισμό. Γι 'αυτό και θα μπορούσε να χρησιμοποιήσει ένα printf πριν και μετά από αυτή την γραμμή κώδικα. Σε αυτήν την περίπτωση, θα μπορούσα ακόμα κάνουν λίγο πιο σαφής λέγοντας debug πριν και τον εντοπισμό σφαλμάτων μετά από τόσες ότι δεν συγχέεται με τον εαυτό μου πολλαπλές γραμμές που μοιάζουν πανομοιότυπα. Τώρα, αν αυτό το μεταγλωττίσετε ξανά και να τρέξει αυτό, εισάγετε έναν αριθμό σαν πέντε και πάλι, μπορούμε να δούμε ότι έχουμε τώρα εξόδου πριν και μετά και διαπιστώνουν ότι δεν έχουμε κάνει μια σαφή διάσπαση ή σαφή έχει τον αριθμό ότι πραγματικά θέλουμε να κάνουμε. Τώρα, σε αυτήν την περίπτωση, αυτό είναι δεν είναι πραγματικά μια σαφή εξόδου. Δεν είναι πραγματικά ένα σαφές αποτέλεσμα που θέλουμε από αυτό το συγκεκριμένο πρόγραμμα. Και αυτό είναι, και πάλι, μια λίγο σκηνοθετημένη. Αλλά, ίσως, ένα από τα πράγματα που θα μπορούσαμε να κάνουμε αν η εν λόγω προδιαγραφή ότι θέλουμε να διαιρέσουμε αυτό με 2 και προσθέστε 1-- Έτσι με άλλα λόγια, θέλουμε να στρογγυλοποιεί up-- συνέχεια θα μπορούσαμε να γνωρίζουμε ότι θα μπορούσαμε κάνει αυτό το συγκεκριμένο πράγμα, σε αυτή την περίπτωση. Τώρα εδώ ξέρουμε ότι θα είναι μπορείτε να προσθέσετε 1 ως κατά το ήμισυ τον αριθμό μας. Ας μεταγλωττίσετε ξανά αυτό και να επιβεβαιώσει ότι αυτό συμπεριφέρεται με τον τρόπο που θέλουμε να. Μπορούμε να δούμε ότι τώρα, πριν έχοντας, έχουμε τον αριθμό 5. Αφού, έχουμε τον αριθμό 3, η οποία σύμφωνα με τις προδιαγραφές μας, είναι αυτό που θέλαμε να κάνουμε. Αλλά αν κοιτάξουμε το έξοδος εδώ, μπορούμε δείτε ότι θα μπορούσαμε να έχουμε ένα άλλο bug εντελώς, η οποία είναι ότι είμαστε αρχική καταμέτρηση μας από 0. Τώρα πάλι, αυτό είναι κάτι ότι έχουμε δει στο παρελθόν και μπορούμε να διορθώσουμε αρκετά εύκολα. Αλλά στην περίπτωση αυτή, έχουμε είχε επίσης το πλεονέκτημα από τη χρήση της εντολής printf απευθείας μέσα από το βρόχο for να γνωρίζουν ακριβώς πού το σφάλμα αυτό συνέβαινε. Έτσι printf καταστάσεις είναι πολύ χρήσιμο στο να θα προσδιοριστεί ο τόπος όπου, ακριβώς στο πηγαίο κώδικα σας, συμβαίνει ένα συγκεκριμένο σφάλμα. Και είναι επίσης σημαντικό να συνειδητοποιήσουμε ότι, όπως γράφουμε κώδικα, μπορεί να έχουμε παραδοχές σχετικά με την κατάσταση του προγράμματος. Ή μπορεί να έχουμε παραδοχές για ποιο μέρος του προγράμματος είναι πράγματι σωστή ή λανθασμένη, όταν αργότερα ως να οικοδομήσουμε πάνω σε αυτό το πρόγραμμα και ένα μέρος του να κάνει σύνθετη και μεγαλύτερου προγράμματος να συνειδητοποιήσουμε ότι κάποια πτυχή από ότι είναι στην πραγματικότητα λάθη. Χρησιμοποιώντας printf μπορεί πραγματικά να βοηθήσει Για να περιορίσετε τα κάτω και να εντοπίσει οι περιοχές του ένα πρόγραμμα που δεν μπορεί να να συμπεριφέρεται ακριβώς τον τρόπο που Αναμένουμε, με βάση τις υποθέσεις μας. Αλλά υπάρχουν και άλλα εργαλεία διαθέσιμα, καθώς, που μας επιτρέπουν να προσπαθήσουμε να καταλάβουμε από όπου συμβαίνει ένα σφάλμα και επίσης, ειδικότερα, ποια πράγματα συμβαίνουν στο εσωτερικό του προγράμματος. Έτσι, χρησιμοποιώντας printf είναι πολύ χρήσιμο όταν θέλουμε να εντοπίσει συγκεκριμένους τομείς ένα πρόγραμμα που να έχει κάποιο σφάλμα. Αλλά καθίσταται επίσης κουραστικό μετά από λίγο. Σε αυτήν την περίπτωση, αυτό είναι ένα σχετικά απλό πρόγραμμα με μόνο ένα ή δύο μεταβλητές. Και αυτό γίνεται πολύ εύκολο για μας να εκτυπώσετε την αξία αυτών των μεταβλητών στο πλαίσιο του ευρύτερου προγράμματος. Αλλά ίσως να έχουμε ένα διαφορετικό πρόγραμμα που έχει πολλές μεταβλητές. Και μπορεί να μην είναι αρκετά τόσο εύκολο στη χρήση printf να προσπαθήσουμε να αξιολογήσουμε τι συμβαίνει σε κάθε μία από αυτές τις μεταβλητές όπως το πρόγραμμα εκτέλεσης. Υπάρχει ένα πρόγραμμα που υπάρχει ονομάζεται ένα πρόγραμμα εντοπισμού σφαλμάτων. Στην περίπτωση αυτή, ο ένας ότι θα χρήση είναι το πρόγραμμα εντοπισμού σφαλμάτων GNU, ή GDB, ότι μας επιτρέπει να επιθεωρήσει την εσωτερική λειτουργίες ενός προγράμματος σε ένα πολύ πιο λεπτομερή τρόπο. Μπορούμε πράγματι να εκτελέσει GDB από τη γραμμή εντολών Εδώ απλά πληκτρολογώντας GDB και την εντολή που θέλετε να διορθώσετε. Στην περίπτωση αυτή, μετράνε. Τώρα, σε αυτή την περίπτωση, μπορούμε να δούμε ότι μας φέρνει σε μια γραμμή που λέει GDB. Και μπορούμε πραγματικά για να εκτελέσει τις εντολές GDB για να ξεκινήσει ουσιαστικά η εκτέλεση της πρόγραμμα, να το σταματήσει σε ορισμένα σημεία, αξιολογεί τις μεταβλητές και να επιθεωρούν τις μεταβλητές που υπάρχουν στον κρατικό πρόγραμμα κατά τη συγκεκριμένη χρονική στιγμή, Και ούτω καθεξής και ούτω καθεξής. Παρέχει μια μεγάλη δύναμη για μας. Αλλά είναι ακριβώς έτσι συμβαίνει ότι το CS50 IDE επίσης παρέχει ένα γραφικό περιβάλλον ή σε ένα χρήστη διεπαφή για GDB ότι μας επιτρέπει να το κάνουμε αυτό, χωρίς να χρειάζεται η απολύτως περιβάλλον γραμμής εντολών ή ακόμα και καθόλου. Ο τρόπος που μπορώ να έχω πρόσβαση ότι είναι με τη χρήση του κουμπιού debug στην κορυφή του IDE CS50. Τώρα, κατά το παρελθόν, αυτό που έχουμε παρατηρείται είναι ότι χρησιμοποιούμε την εντολή γραμμή για την κατάρτιση και, στη συνέχεια, εκτελέστε ένα πρόγραμμα. Το κουμπί κάνει debug δύο από αυτά τα βήματα. Αλλά, επίσης, θα εμφανιστεί η καρτέλα εντοπισμού σφαλμάτων για την άκρα δεξιά ότι μας επιτρέπει να επιθεωρήσει μια ποικιλία των ιδιοτήτων του προγράμματος καθώς εκτέλεσης. Αν κάνω κλικ εντοπισμού σφαλμάτων, σε αυτό το περίπτωση, θα εμφανιστεί μια νέα καρτέλα στην κονσόλα παράθυρο στο κάτω μέρος. Και μπορείτε να δείτε ότι αυτή η καρτέλα έχει ορισμένες πληροφορίες στην κορυφή. Και μπορούμε να αγνοήσουμε αυτό σε μεγάλο βαθμό. Αλλά ένα από τα πράγματα ότι θέλουμε να παρατηρήσετε είναι ότι εξάγει το ίδιο πράγμα που θα θα έπαιρνε αν προσπαθήσαμε να κάνει για Το πρόγραμμα C στο παράθυρο τερματικού. Εδώ, μπορούμε να δούμε ότι τρέχει κλαγγή, και έχει μια ποικιλία από σημαίες, και έχει την κατάρτιση φακέλου count.c μας, η οποία ήταν η επιλεγμένη καρτέλα στο χρόνο ότι χτύπησα τον εντοπισμό σφαλμάτων. Έτσι, αυτό είναι πολύ χρήσιμο επειδή τώρα χρησιμοποιώντας αυτό το κουμπί εντοπισμού σφαλμάτων, μπορούμε ταυτόχρονα να καταρτίζουν και, στη συνέχεια, εκτελέσει το πρόγραμμα που στην πραγματικότητα θέλετε να εκτελέσετε. Μία από τις σημαίες που είναι σημαντικό, στην περίπτωση αυτή, Έχουμε πράγματι χρήση για το μεγαλύτερο χρονικό διάστημα αλλά και απλά έκανε κάποιες χέρι κουνώντας [δεν ακούγεται], η οποία Είναι αυτό ακριβώς εδώ. Σε κλαγγή, λέει -ggdb3. Σε αυτή την περίπτωση, τι είμαστε λέει κλαγγή, compiler μας, είναι ότι θέλουμε να καταρτίσει το πρόγραμμά μας. Αλλά, επίσης, να παρέχουν ό, τι είναι ονομάζεται πληροφορία σύμβολο έτσι ώστε ο compiler έχει πράγματι πρόσβαση σε μια παρτίδα των υποκείμενων πληροφοριών περιέχεται εντός του προγράμματος. Πιο συγκεκριμένα, ο αριθμός των λειτουργιών που έχω, τα ονόματα των αρμοδιοτήτων αυτών, Οι μεταβλητές, οι τύποι ότι οι μεταβλητές είναι, και μια ποικιλία άλλα πράγματα που βοηθούν το πρόγραμμα εντοπισμού σφαλμάτων εκτελέσει τις λειτουργίες του. Τώρα υπάρχει κάτι άλλο ότι είναι σημαντικό να αναφέρουμε όταν συζητάμε λειτουργίας ένα πρόγραμμα με αυτόν τον τρόπο. Παρατηρήστε ότι έχει πράγματι ανατραφεί μια νέα καρτέλα σε κονσόλα μας κατά μήκος του πυθμένα. Δεν έχουμε πλέον να αλληλεπιδρούν άμεσα με το παράθυρο τερματικού. Αλλά αυτή η νέα καρτέλα είναι στην πραγματικότητα ένα παράθυρο τερματικού. Απλά είναι ειδικά για τη λειτουργία το πρόγραμμα που έχουμε δημιουργήσει. Παρατηρήστε ότι στο κάτω μέρος, σε συνδυασμό με κάποια έξοδο κλαγγή από τον compiler και GDB, το οποίο μπορούμε να αγνοήσουμε σε μεγάλο βαθμό, δείχνει πραγματικά την έξοδο του το πρόγραμμά μας στο κάτω μέρος. Τώρα είναι σημαντικό να συνειδητοποιήσουμε ότι αυτό το ένα παράθυρο στην πραγματικότητα θα σας δείξει το έξοδος από το πρόγραμμα σας αλλά επίσης μπορεί να δεχτεί είσοδο για το εν λόγω πρόγραμμα, καθώς και. Έτσι ειδοποίηση που λέει παρακαλώ εισάγετε έναν αριθμό, η οποία είναι η ίδια έξοδος που είχαμε είχε στο παράθυρο τερματικού πριν. Αλλά είναι τώρα εμφανίζονται σε αυτό νέα καρτέλα. Δεν μπορώ να εισάγετε έναν αριθμό. Και αυτό θα είναι πράγματι λειτουργούν ως αναμένουμε δείχνοντάς μας εντοπισμού σφαλμάτων μας, την παραγωγή, η έξοδος που μπορεί να είναι προβληματικό, όπως έχουμε δει στο παρελθόν. Και στο κάτω μέρος, το έχει πραγματικά κάποια επιπλέον παραγωγή από το ΑΕΠ μόνο λέγοντας ότι Αυτό το πρόγραμμα έχει ολοκληρωθεί. Τώρα, όπως είδατε σε αυτό το Ειδικότερα τρέχει μέσα, δεν ήταν ιδιαίτερα χρήσιμη, διότι ακόμη αν και είχαμε το μενού εντοπισμού σφαλμάτων έρχονται up, αυτό ήταν ακόμα ένα πρόγραμμα που εκτελείται. Σε κανένα σημείο έκανε πραγματικότητα παύση εκτέλεσης για εμάς να είναι σε θέση να λάβει γνώση όλων των οι μεταβλητές που περιέχονται εντός. Υπάρχει κάτι άλλο ότι έχουμε να κάνουμε, προκειμένου για να πάρει GDB να αναγνωρίσουν ότι θέλουμε για να διακόψετε την εκτέλεση του προγράμματος και όχι μόνο επιτρέπουν να προχωρήσει κανονικά όπως θα κάνατε σε κάθε άλλη περίπτωση. Για να διακόψετε την εκτέλεση, σε κάποια συγκεκριμένη γραμμή, πρέπει να δημιουργήσουμε ό, τι είναι ονομάζεται σημείο καμπής. Και το σημείο καμπής είναι πολύ εύκολα δημιουργούνται σε αυτό το CS50 IDE με τη λήψη του ποντικιού σας και κάνοντας κλικ απευθείας προς τα αριστερά από κάποιο συγκεκριμένο αριθμό γραμμής. Μόλις γίνει αυτό, μια κόκκινη κουκκίδα Φαίνεται, γεγονός που δείχνει ότι η εν λόγω γραμμή είναι τώρα ένα σημείο καμπής. Και την επόμενη φορά που τρέχω GDB, το θα σταματήσει την εκτέλεση σε εκείνο το σημείο θραύσης όταν φτάσει εκείνη την γραμμή κώδικα. Τώρα αυτό είναι ένα σημαντικό πράγμα που πρέπει να συνειδητοποιήσουμε ότι δεν είναι κατ 'ανάγκη το υπόθεση ότι κάθε γραμμή κώδικα είναι πραγματικά προσβάσιμη. Εάν επρόκειτο να δημιουργήσετε μια συνάρτηση εδώ, για example-- άκυρη f-- και απλά να κάνουμε μια γραμμή εκτύπωσης here-- γεια world-- αν δεν Καλώ αυτή τη λειτουργία, θα είναι η υπόθεση ότι, αν μπορώ να ορίσω ένα σημείο καμπής εδώ, η λειτουργία δεν θα πρέπει να ονομάζεται. Και ως εκ τούτου, αυτή η ιδίως το σημείο καμπής δεν θα είναι ποτέ πραγματικά παύση εκτέλεση του προγράμματος. Ας πούμε ότι έχω δημιουργήσει σωστά ένα σημείο καμπής σε κάποια γραμμή κώδικα ότι όντως θα εκτελεστεί. Τώρα, σε αυτήν την περίπτωση, αυτό είναι το πρώτη γραμμή στην κύρια λειτουργία. Έτσι, θα είναι σίγουρα η περίπτωση ότι, μόλις αρχίζω την εκτέλεση, θα επιτευχθεί η πρώτη γραμμή. GDB θα σταματήσει την εκτέλεση. Και τότε, θα είμαι σε θέση να αλληλεπιδρούν με το πρόγραμμα εντοπισμού σφαλμάτων. Μπορείτε να ορίσετε πολλαπλές γραμμές σημεία παύσης, αν θέλετε. Μπορούμε επίσης να δημιουργήσετε ένα line up εδώ σε αυτό το τμήμα του κώδικα ότι ποτέ δεν θα επιτευχθεί. Και μπορούμε επίσης να ορίσετε μία περαιτέρω παρακάτω. Ο λόγος ότι θα θέλουμε να το κάνουμε αυτό θα πάει σε λίγο περισσότερο λεπτομέρεια σε μια στιγμή. Έτσι, για τώρα, επιτρέψτε μου να απενεργοποιήσετε Αυτά τα πρόσθετα σημεία διάλειμμα έτσι ώστε να μπορούμε να δούμε τι συμβαίνει όταν έχω ένα μόνο διάλειμμα σημείο του προγράμματός μου. Έχω κάνει κάποια αλλαγές σε αυτό το πρόγραμμα. Γι 'αυτό και πρέπει να το σώσει. Θα κάνετε κλικ εντοπισμού σφαλμάτων, ώστε να μπορώ να να αρχίσει την κατάρτιση και, στη συνέχεια, εκτέλεση του προγράμματος εντοπισμού σφαλμάτων. Θα δούμε ότι, μετά από τις στιγμές, τις γραμμή που θα επιλεγεί ως το διάλειμμα σημείο τονίζεται σε κίτρινο. Μπορούμε επίσης να παρατηρήσετε ότι στην πάνω δεξιά στην οθόνη εντοπισμού σφαλμάτων ότι το εικονίδιο παύσης έχει μετατραπεί σε ένα μικρό εικονίδιο αναπαραγωγής. Αυτό σημαίνει ότι έχουμε παύση εκτέλεση, στη συγκεκριμένη περίπτωση. Και πατώντας το κουμπί Play θα μας επιτρέψει να περάσουμε την εκτέλεση σε εκείνο το συγκεκριμένο σημείο. Σημειώστε ότι υπάρχει ένα ζευγάρι των άλλων κουμπιά διατίθενται σε αυτό το debug πίνακα, επισης. Βήμα πάνω, η οποία μου επιτρέπει να εκτελέσει το μία γραμμή κώδικα και βήμα πάνω σε αυτή τη γραμμή για το επόμενο One, η οποία, στην περίπτωση αυτή, θα σήμαινε ότι η printf Δήλωση εκτελείται. Και τότε θα παύση εκτέλεση επί της γραμμής 13, όπως έτσι. Και υπάρχει επίσης ένα βήμα σε λειτουργία, η οποία είναι χρήσιμο αν έχω δημιουργήσει άλλες λειτουργίες αλλού στον πηγαίο κώδικα. Και θέλω να μπω Οι αρμοδιότητες αυτές αντί εκτελέσει αυτή τη λειτουργία στο σύνολό της. Αλλά θα δούμε περισσότερα στο στάδιο σε λειτουργία σε λίγο. Τώρα παρατηρήσετε κάποια άλλα πράγματα που υπάρχουν στην πραγματικότητα μέσα σε αυτό το debug πίνακα. Έχουμε αυτό το πάνελ που ονομάζεται καλέστε στοίβα, η οποία μας δείχνει πού ακριβώς βρισκόμαστε. Σε αυτή την περίπτωση, είμαστε μέσα της κύριας λειτουργίας. Script μας ονομάζεται count.c. Και τυχαίνει να είναι σε γραμμή 13, στήλη μία, η οποία είναι ακριβώς η τονισμένη περιοχή του πηγαίου κώδικα δείχνει, όπως καλά. Τώρα παρατηρώ ότι αυτό δείχνει επίσης σύμφωνα με την τοπική μεταβλητή ενότητα όλες τις μεταβλητές που υπάρχουν μέσα σε αυτή τη λειτουργία. Είναι σημαντικό να σημειωθεί ότι όλες οι μεταβλητές θα εμφανίζονται σε αυτήν την τοπική μεταβλητή ενότητα μέσα σε μια συνάρτηση, ακόμη και πριν από αυτές έχουν καθοριστεί. Μπορούμε να δούμε εδώ ότι έχουμε μια μεταβλητή num ονομάζεται, έχει μια προκαθορισμένη τιμή 0, και είναι του τύπου int. Τώρα, πριν έχουμε πραγματικά προετοιμαστεί όλες αυτές τις μεταβλητές, δεν είμαστε κατ 'ανάγκην εγγυημένη για να δείτε την τιμή 0. Και ανάλογα με τις άλλες εκτελέσεις ότι έχουν εκτελέσει και η κατάσταση της μνήμης σας όταν τρέχετε πραγματικά αυτό το πρόγραμμα, μπορείτε να διαπιστώσετε ότι έχετε Δεν βλέπω τιμές από 0 και, αντ 'αυτού, ορισμένα άλλα τρελός αριθμούς. Αλλά μην ανησυχείτε γι 'αυτό. Δεν πρόκειται να είναι σχετικές μέχρι μπορείτε πραγματικά να προετοιμάσει την τιμή. Τώρα, σε αυτή την περίπτωση, μπορούμε να δούμε ότι Έχω πραγματοποίησαν περίπου εξόδους. Και εγώ, αυτή τη στιγμή, σε παύση εκτέλεσης. Αλλά σε αυτή την περίπτωση, τι Θέλω πραγματικά να κάνω είναι τώρα βήμα πέρα ​​από αυτή τη γραμμή του κώδικα, έτσι ώστε μπορώ πραγματικά το ερώτημα του χρήστη για αυτό το int ότι θέλουμε να χρησιμοποιήσουμε στο πρόγραμμά μας. Τώρα, στην περίπτωση αυτή, όταν Χτύπησα το βήμα πάνω, σημείωση ότι η Παύση ή μάλλον το βιογραφικό κουμπί έχει αλλάξει σε αυτό το κουμπί Pause επειδή αυτός ο κώδικας είναι πραγματικά εκτέλεσης. Τι γίνεται αυτή τη στιγμή είναι ότι είναι μας περιμένει στην είσοδο κάποιες πληροφορίες όπως μπορούμε να δούμε από το κείμενο εξόδου μας στο κάτω μέρος. Έτσι, αυτή τη στιγμή, αυτό είναι δεν είναι στην πραγματικότητα διακοπεί, έστω και αν, είδος, φαίνεται να είναι, διότι δεν συμβαίνει τίποτα. Αλλά ακριβώς έτσι συμβαίνει ότι σε συγκεκριμένη περίπτωση μου επί της γραμμής 13, Είμαι σε αναμονή για την είσοδο του χρήστη. Και έτσι GDB δεν είναι σε θέση να ελέγχουν ένα πρόγραμμα που βρίσκεται σε λειτουργία. Τώρα, η επόμενη φορά που μπαίνω μερικά input-- γι 'αυτό θα εισάγετε τον αριθμό 5, όπως είδαμε στο past-- χτύπησε την επιστροφή, και εμείς ανακοινώνει ότι, αμέσως, GDB παύσεις και, πάλι, τονίζει την επόμενη γραμμή. Να σημειωθεί όμως ότι τώρα, ως αποτέλεσμα της εισαγωγής μας αξία, έχουμε ενημερωθεί ότι η αξία εσωτερικό των τοπικών μεταβλητών μας, η οποία είναι πολύ χρήσιμο να γνωρίζουμε με ακρίβεια τι αριθμός ήταν στη μνήμη. Τώρα μπορώ να επιτρέψετε στο πρόγραμμα να συνεχίσει παίζουν μέχρι το τέλος της εκτέλεσης του πατώντας Συνέχεια. Μπορούμε να δούμε ότι πολύ γρήγορα κάνει το φινίρισμα πρόγραμμα εκτέλεσης με το ίδιο αποτέλεσμα που θα είχε πριν, το πρόγραμμα εντοπισμού σφαλμάτων κλείνει, και τώρα αυτό το πρόγραμμα έχει σταματήσει εντελώς. Ι δείχνουν ότι μόνο η σκοπούς του να δει τι συμβαίνει όταν χτύπησε πραγματικά βιογραφικό. Αλλά στην πραγματικότητα πρόκειται να θέλω να πάω πίσω σε αυτό το πρόγραμμα έτσι ώστε να μπορούμε να προσπαθήσουμε να debug ακριβώς τι συμβαίνει. Τώρα που είμαι χρησιμοποιώντας το πρόγραμμα εντοπισμού σφαλμάτων, μου επιτρέπετε Δεν χρειάζεται να διορθώσετε αυτές τις δηλώσεις printf. Γι 'αυτό και θα μπορούσε να τα αφαιρέσετε, όπως θα κάνω τώρα μόνο για να πάει πίσω στο απλούστερο κώδικα μας ότι είχαμε πριν από λίγο. Τώρα, όταν θα σώσει το προγραμματίσουν και να το εκτελέσει, θα, και πάλι, πηγαίνετε στην αρχική σπάσει το σημείο που είχα στη γραμμή 11. Και θα είμαι σε θέση να ελέγχουν μεταβλητές μου θέλω να κάνω. Είναι ακριβώς έτσι συμβαίνει ότι αυτό μέρος δεν είναι πολύ ενδιαφέρουσα, Και ξέρω ότι θα πάω να εκτυπώσετε αυτή τη δήλωση. Παρακαλώ εισάγετε έναν αριθμό. Και τότε, ξέρω ότι θα πάω να ζητήσει από το χρήστη για το συγκεκριμένο ακέραιο. Έτσι, ίσως, εγώ πραγματικά θέλουν να κινηθούν μου σπάσει το σημείο λίγο πιο κάτω. Μπορείτε να αφαιρέσετε σημεία διάλειμμα κάνοντας κλικ, και πάλι, απ 'ευθείας στα αριστερά του αριθμού γραμμής. Αυτό κόκκινη κουκκίδα θα εξαφανιστούν, αναφέροντας ότι το σημείο καμπής είναι πλέον φύγει. Τώρα, στην περίπτωση αυτή, η εκτέλεση έχει διακοπεί. Και έτσι δεν είναι πραγματικά πρόκειται να επαναλάβει σε αυτή τη συγκεκριμένη περίπτωση. Αλλά μπορώ να ορίσετε ένα διάλειμμα σημείο λίγο αργότερα. Και όταν εγώ τώρα το βιογραφικό μου κώδικα, θα συνεχιστεί και πες το σημείο εκείνο το σημείο θραύσης. Και πάλι, χτύπησα Συνέχιση. Δεν φαίνεται σαν κάτι συμβαίνει. Αλλά αυτό συμβαίνει γιατί μου κώδικας είναι σε αναμονή για την είσοδο. Θα εισάγετε έναν αριθμό 5, πατήστε Enter, και τώρα το επόμενο σημείο καμπής θα χτυπήσει. Τώρα, σε αυτήν την περίπτωση, αυτό είναι η γραμμή κώδικα ότι, πριν, ξέραμε έτυχε να είναι προβληματικό. Ας αξιολογήσουμε τι συμβαίνει σε αυτή τη συγκεκριμένη χρονική στιγμή. Όταν μια γραμμή επισημαίνεται, αυτό γραμμή δεν έχει ακόμη εκτελεστεί. Έτσι, σε αυτή την περίπτωση, μπορούμε να δούμε ότι έχω έναν αριθμό, ο οποίος Έχω έναν ακέραιο αριθμό που ονομάζεται num που έχει την τιμή 5. Και Πάω να εκτελεί μαθηματικά σε αυτόν τον αριθμό. Αν πατήσω πάνω από αυτό, μπορούμε να Σημειώστε ότι η τιμή για Num έχει αλλάξει σύμφωνα με το αριθμητική που έχουμε κάνει στην πραγματικότητα. Και τώρα που είμαστε στο εσωτερικό του αυτό για βρόχο ή τώρα ότι ο βρόχος for να είναι επιλεγμένο, βλέπουμε ότι έχουμε μια νέα μεταβλητή που ονομάζεται i ότι πρόκειται να χρησιμοποιηθεί από το ότι για βρόχο. Τώρα θυμάμαι πριν από την Ι ανέφεραν ότι μερικές φορές είστε πρόκειται να δούμε κάποια τρελή αριθμών ως προεπιλογή πριν από αυτόν τον αριθμό ή ότι η μεταβλητή είναι πραγματικά προετοιμαστεί. Μπορούμε να δούμε ότι ακριβώς εδώ στη μεταβλητή αυτή που ονομάζεται i, η οποία δεν έχει ακόμα αρχικοποιηθεί κατά τη στιγμή της τονίζοντας. Αλλά μπορούμε να δούμε ότι έχει κάποιο αριθμό ότι δεν θα αναμένουν. Δεν πειράζει. Μην ανησυχείτε γι 'αυτό γιατί δεν έχουμε πραγματικότητα προετοιμαστεί αυτόν τον αριθμό μέχρι να βήμα πέρα ​​από αυτή τη γραμμή και την τιμή i έχει προετοιμαστεί με την τιμή 1. Έτσι για να δείτε ότι αυτό είναι πράγματι η υπόθεση, ας το βήμα πάνω. Μπορούμε τώρα να δούμε ότι αυτό γραμμή έχει εκτελεστεί. Και τώρα τονίζοντας Αυτή η γραμμή printf. Και μπορούμε τώρα να δούμε πώς οι αξίες μας των i και 3 έχουν αλλάξει με την πάροδο του χρόνου. Αυτό είναι πολύ χρήσιμο να κάνουμε, στην πραγματικότητα, είναι να το βήμα πάνω από τις γραμμές επανειλημμένα. Και μπορείτε να βρείτε αυτό που πραγματικά συμβαίνει στο εσωτερικό του για το βρόχο σας και τι συμβαίνει με το μεταβλητές μέσα του ότι για βρόχο ως εκείνη την εκτέλεση του προγράμματος εμφανίζεται ένα βήμα τη φορά. Τώρα, σε αυτό το σημείο, ενισχυθεί πάνω ακριβώς αρκετό ότι Τώρα είμαι στο τέλος του προγράμματός μου. Αν πατήσω πάνω από αυτό, θα στην πραγματικότητα σταματήσει την εκτέλεση όπως έχουμε δει στο παρελθόν. Επιτρέψτε μου να επανεκκινήσετε αυτό, ακόμη μια φορά, έτσι ότι μπορώ να επισημάνω και κάτι άλλο έξω, επισης. Σε αυτή την περίπτωση, είναι τώρα με ρωτούν, και πάλι, για έναν αριθμό, ο οποίος Θα, και πάλι, αρχίζει. Αλλά αυτή τη φορά, Πάω να εισέλθουν στην μεγαλύτερος αριθμός έτσι ώστε ο βρόχος for θα επαναλάβει περισσότερες φορές. Σε αυτήν την περίπτωση, θα πάω για να εισάγετε μια τιμή των 11. Τώρα και πάλι γιατί είχα οριστεί ένα σημείο καμπής στη γραμμή 15, πρόκειται να επισημάνετε αυτή τη γραμμή. Μπορούμε να δούμε ότι μας αριθμός 11 είναι σωστά εκπροσωπούνται σε τοπικές μεταβλητές μας. Ενίσχυση πάνω από αυτό, μπορούμε τώρα δείτε τι συμβαίνει με την αξία μας i καθώς προχωράμε μέσα από αυτό για το βρόχο. Παίρνει αυξάνεται κάθε φορά που φτάσετε στην κορυφή του ότι για βρόχο. Τώρα, ένα από τα πράγματα που θα μπορούσαν να είναι χρήσιμο να κάνουμε κατά τη διάρκεια της εκτέλεσης αυτού του προγράμματος είναι για μένα πραγματικά αλλάξετε το μέσο του ποταμού μεταβλητές για να δείτε τι συμβαίνει με το πρόγραμμά μου. Σε αυτήν την περίπτωση, δεν μπορώ πραγματικά διπλό κλικ στην τιμή. Παρατηρήστε ότι γίνεται ένα πεδίο κειμένου. Τώρα μπορώ να εισαγάγετε διαφορετική Εκτιμούμε συνολικά για να δούμε πώς συμπεριφέρεται το πρόγραμμά μου όταν έχω αλλάξει αυτήν τη μεταβλητή. Τώρα, στην περίπτωση αυτή, η μεταβλητή i περιέχει τώρα την τιμή 10. Αλλά το πρόγραμμα εξακολουθεί να είναι παύση στην εκτέλεση. Όταν περπατώ πάνω, βλέπω ότι η i αξίας, που μπήκα ως 10, δεν είναι μεγαλύτερη από την αξία του num, η οποία αμέσως προκαλεί ο βρόχος for να σταματήσει την εκτέλεση. Τώρα αυτό δεν είναι το μόνο λόγος για τον οποίο θα κάνατε θέλετε να τροποποιήσετε τη μεταβλητή στη θέση του. Μπορεί να θέλουν πραγματικά για να προσπαθήσει να το τροποποιήσει έτσι ότι μπορείτε να συνεχίσετε εκτέλεση ενός βρόχου ή έτσι ώστε να μπορείτε να τροποποιήσετε κάποια αξία πριν φτάσει κάποιο συγκεκριμένο σύνολο της αριθμητικής ότι είστε έτοιμος να εκτελέσει. Έτσι τώρα που πραγματικά να αλλάξει η αξία του i ως το πρόγραμμα εκτέλεσης, προκάλεσε το βρόχο για να σταματήσουν το κάπνισμα πρόωρα, διότι, ξαφνικά, θ έτυχε να είναι μεγαλύτερη από την αξία του υπ 'αριθμ, πράγμα που σημαίνει ότι για βρόχο που δεν χρειάζονται πλέον να εκτελεστεί. Περαιτέρω, έτυχε να είναι η περίπτωση που αλλάξει η τιμή του i όταν η γραμμή 17 τονίστηκε, που ήταν το σημείο στο χρόνο ότι η εκτέλεση του loop για ήταν στην πραγματικότητα στο στάδιο της αξιολόγησης. Αν είχα αλλάξει την αξία του i σε μια διαφορετική γραμμή, ας πούμε 19, θα είχαμε δει διαφορετικά επειδή η συμπεριφορά της γραμμής 19 θα έχουν εκτελεστεί πριν από το βρόχο κατάσταση επανεκτιμήθηκε. Τώρα, σε αυτό το σημείο, είμαι, και πάλι, Στο τέλος αυτού του προγράμματος. Και μπορώ να επιτρέψουμε να προχωρήσει σε επιτρέψει το πρόγραμμά μου για να σταματήσουν το κάπνισμα φυσικά. Αλλά υπάρχουν μερικά πράγματα που είναι σημαντικό για να πάρει από αυτή τη συγκεκριμένη συζήτηση. Θα πρέπει να αξιολογήσει Οι δικές σας υποθέσεις σχετικά με το πώς ο κώδικας θα πρέπει να συμπεριφέρεται. Κάθε φορά που θα σκεφτείτε ότι κάποιο κομμάτι Κωδικός ξέρετε συμβαίνει να εργαστεί, ότι θα μπορούσε να είναι μια κόκκινη σημαία για να πάει πίσω και να αξιολογήσει, και να είστε σίγουροι ότι η υπόθεση σας πώς ο εν λόγω κώδικας είναι σε λειτουργία Είναι όντως αλήθεια για το πώς είναι εκφρασμένη σε πηγαίο κώδικα σας. Αλλά ακόμη περισσότερο με το σημείο ήταν όταν χρησιμοποιείτε το πρόγραμμα εντοπισμού σφαλμάτων, μπορείτε να βάλετε σε σημεία διακοπής διαφορετικές γραμμές κώδικα, το οποίο θα προκαλέσει το πρόγραμμα εντοπισμού σφαλμάτων για παύση εκτέλεσης σε καθεμία από τις γραμμές έτσι ώστε να μπορείτε να αξιολογήσετε το μνήμη ή ακόμα και την αλλαγή του τόπου. Και πάλι, να θυμάστε ότι μπορείτε να κάνετε δημιουργήσετε πολλαπλά σημεία διακοπής, έτσι ώστε να μπορούν επίσης να επαναλάβει την εκτέλεση, παραλείψτε πάνω από μεγάλα τμήματα του κώδικα, και αυτό θα σταματήσει αυτόματα στο επόμενο σημείο θραύσης. Υπάρχει στην πραγματικότητα πιο προηγμένη χαρακτηριστικά του διορθωτή, όπως καλά. Αλλά θα πρέπει να σας παραπέμψω σε κάποιες μεταγενέστερες βίντεο ώστε πραγματικά να δώσουμε έμφαση, εκτός πώς να χρησιμοποιούν αυτές τις συγκεκριμένες λειτουργίες. Προς το παρόν, σας ευχαριστώ πάρα πολύ για την προσοχή. Και καλή τύχη εντοπισμού σφαλμάτων.