[Powered by Google Translate] GDB, το Έργο GNU Debugger, είναι ένα ισχυρό εργαλείο εντοπισμού σφαλμάτων για C,
μαζί με πολλές άλλες γλώσσες.
Σας επιτρέπει να σακί γύρω από μέσα σας προγράμματα C, ενώ από όπου και αν την εκτέλεση,
και αυτό σας δίνει επίσης την ευκαιρία να δούμε ακριβώς τι συμβαίνει
όταν κολλάει το πρόγραμμά σας.
Είναι αρκετά ικανό, έτσι δεν είναι;
GDB είναι ελεύθερο λογισμικό, και λειτουργεί με πολλά δημοφιλή UNIX και
Που βασίζονται στα Windows λειτουργικά συστήματα, γι 'αυτό είναι ένα πολύ διαδεδομένο εργαλείο.
>> Θα πρέπει να μάθουν να το αγαπούν.
GDB επαγγελματίες έχουν έναν πολύ ευκολότερο χρόνο τον εντοπισμό bugs
από εκείνους που έχουν λυθεί με εικασίες
και άπειρες ποσότητες των καταστάσεων εκτύπωσης.
GDB είναι ένα εργαλείο γραμμής εντολών, το οποίο σημαίνει ότι μπορείτε να αλληλεπιδράσετε με αυτό σε ένα τερματικό
εκδίδει εντολές μέσω του πληκτρολογίου αντί να κάνετε κλικ με το ποντίκι κουμπιά σας.
>> Για να ξεκινήσετε GDB, μπορείτε κυριολεκτικά απλά πληκτρολογήστε gdb στην προτροπή και πατήστε enter.
Θα δείτε μερικές γραμμές εκτυπώνονται στην οθόνη
δείχνοντάς σας την έκδοση της GDB ότι τρέχετε,
πληροφορίες πνευματικών δικαιωμάτων του, και στο τέλος θα δείτε το GDB εντολών: (gdb).
Αυτό σας επιτρέπει να γνωρίζετε ότι GDB είναι έτοιμο για εντολές.
Σε αυτό το σημείο, το πιο σημαντικό πράγμα που πρέπει να ξέρετε πώς να κάνετε είναι να σταματήσουν το κάπνισμα.
Ευτυχώς, αυτό είναι αρκετά απλή.
Η εντολή quit κάνει ακριβώς αυτό.
Ως συντόμευση, μπορείτε να χρησιμοποιήσετε μόνο q πάρα πολύ.
Όπως διασκεδαστικό ως εκκίνηση GDB και στη συνέχεια, αμέσως εγκατάλειψη είναι,
Ας μιλήσουμε τώρα για τη χρήση GDB για να βοηθήσει τον εντοπισμό σφαλμάτων ενός προγράμματος.
>> Για να ξεκινήσετε, έχω εδώ ένα πρόγραμμα σε factorial.c
που παίρνει ένα int και προσπαθεί να υπολογίσει το παραγοντικό του.
Σε περίπτωση που δεν έχετε δει πριν παραγοντικών ή δεν τα θυμάμαι,
Το παραγοντικό του αριθμού n είναι ίσο με το γινόμενο των n - (n - 1), (n - 2), και ούτω καθεξής -
μέχρι να χτυπήσει 1.
Συνεπώς, το παραγοντικό του 3 είναι 3 * 2 * 1, ή 6,
και το παραγοντικό του 4 είναι 4 * 3 * 2 * 1, ή 24.
Το παραγοντικό του μηδέν είναι μια περίεργη περίπτωση, είναι 1,
και δεν ορίζονται οι παραγοντικών των αρνητικών ακεραίων.
Τέλος πάντων, κάτι για το παραγοντικό πρόγραμμα μου είναι funky.
Όταν το τρέχω, να εκτυπώνει περίεργα αριθμούς που δεν έχουν καμία σχέση με παραγοντικών.
>> Έτσι, μπορούμε να χρησιμοποιήσουμε GDB για να βοηθήσει να καταλάβω τι συμβαίνει.
GDB δραστηριοποιείται σε εκτελέσιμα αρχεία,
που είναι τα δυαδικά αρχεία που παράγονται από τη διαδικασία μεταγλώττισης.
Δηλαδή, δεν μπορούμε να τρέξει για GDB. Ή γ μας. H αρχεία πηγαίου κώδικα, όπως factorial.c.
Θέλουμε να τρέξει σε παραγοντικό μόνο αντ 'αυτού.
Εάν το πρόγραμμα που απαιτείται οποιαδήποτε ορίσματα της γραμμής εντολών,
αυτό είναι που θα τους καθορίσει.
Σε αυτή την περίπτωση, παραγοντικό δεν απαιτεί ορίσματα της γραμμής εντολών,
έτσι απλά πληκτρολογήστε τρέξιμο ή r για συντομία.
>> Αυτό θα ξεκινήσει η παραγοντική λειτουργία του προγράμματος.
Όταν το πρόγραμμα σταματάει, θα πάρω GDB μου ζητήσει πίσω.
Εντάξει, ας προσπαθήσουμε ξανά το ίδιο πράγμα, παραγοντικό του 4.
Εντάξει, θα δούμε ότι παίρνουμε το ίδιο είδος σκουπίδια εδώ στην GDB.
Τώρα που το πρόγραμμα έχει τελειώσει,
δεν μπορούμε να πάμε και να προσπελάσετε οποιαδήποτε κατάσταση,
έτσι θα πρέπει να ξεκινήσει να τρέχει και πάλι για να μπορέσουμε να δούμε τι συμβαίνει.
Ωστόσο, χρειαζόμαστε έναν τρόπο να το σταματήσει, ενώ είναι στη μέση της διαδρομής του.
>> Για να γίνει αυτό, χρησιμοποιούμε αυτό που ονομάζεται ένα σημείο διακοπής.
Breakpoints πει GDB να σταματήσει το πρόγραμμα σε μια συγκεκριμένη λειτουργία ή πηγή γραμμή κώδικα
έτσι ώστε να μπορούμε να εξετάσουμε την κατάσταση του προγράμματος,
οι τιμές των μεταβλητών, η κατάσταση της μνήμης και τέτοια, σε εκείνο το σημείο.
Επειδή εγώ δεν ξέρω πραγματικά, όπου τα πράγματα πάνε στραβά,
>> Θέλω απλά να αρχίσει debugging δικαίωμα στην αρχή,
δικαίωμα όταν αρχίζει κύρια.
Θα ορίσετε ένα breakpoint στην αρχή της κύριας χρησιμοποιώντας την εντολή break.
Μπορούμε επίσης να χρησιμοποιήσουμε το b για να συντομεύσει διάλειμμα.
Τώρα ας ξεκινήσουμε το πρόγραμμα τρέχει και πάλι.
Εδώ είμαστε στην αρχή της κύριας, ακριβώς όπως μας λέει GDB.
Η γραμμή του κώδικα που είναι έτοιμος να εκτελέσει, αλλά δεν έχει ακόμη
printf είναι η γραμμή.
Μπορούμε να πούμε GDB να εκτελέσει αυτή τη γραμμή του κώδικα και να πάει στην επόμενη γραμμή
με την επόμενη εντολή ή n.
>> Εντάξει, τώρα GDB μας λέει ότι είμαστε στη γραμμή GetInt.
Ξέρω ότι φαίνεται σαν η γραμμή printf δεν τρέχει
δεδομένου ότι δεν βλέπουμε "Εισάγετε ένα θετικό ακέραιο" εκτύπωση στην οθόνη,
αλλά δεν λειτουργεί πραγματικά.
Αυτό που βλέπουμε είναι το λειτουργικό σύστημα καταστείλει τίποτα γραπτώς στην οθόνη
έως ότου να έχει απολύτως, γιατί το οποίο αποσφαλμάτωση με εκτυπώσεις
μπορεί μερικές φορές να φαίνεται αναξιόπιστη.
Τέλος πάντων, ας πάμε πάλι στην επόμενη γραμμή του κώδικα και να τεθεί σε int.
Και πάλι, ας τύπου 4.
Έτσι, αυτό φαίνεται παράξενο. Είμαστε στην γραμμή 12, σύμφωνα με GDB,
αλλά η επόμενη γραμμή που είναι έτοιμος να εκτελέσει είναι απλά ένα άγκιστρο.
>> Αυτό απλά σημαίνει ότι είμαστε στο τέλος του βρόχου, ενώ μας κάνει θηλιά στην πραγματικότητα,
GDB και μας λέει ότι η κατάσταση τερματισμού, δηλαδή κανένας κάτω από το μηδέν,
θα εκτελέσει επόμενο.
Αν αυτό γίνεται πάντα μια μικρή σύγχυση,
μπορούμε να σηκώσει τον πηγαίο κώδικα σε GDB με τη λίστα ή εντολή l.
Αυτό εκτυπώνει τον πηγαίο κώδικα
Αυτό είναι επικεντρωμένη γύρω από τη γραμμή που είμαστε σήμερα σε.
Αν πληκτρολογήσετε λίστα ή l και πάλι, θα δούμε το επόμενο σύνολο των γραμμών εκτυπώσετε.
Μπορούμε να το κάνουμε αυτό μέχρι να χτυπήσει το τέλος του αρχείου.
>> Για να επιστρέψετε στο σημείο όπου βρισκόμασταν, θα μπορεί να παρέχει λίστα με τον αριθμό της γραμμής,
στην περίπτωση αυτή, της γραμμής 12.
Τέλος πάντων, ας προχωρήσουμε.
Τώρα είμαστε στο βρόχο 4.
Ας βεβαιωθείτε ότι μεταβλητή num μας περιέχει 4.
Το κάνουμε αυτό με την εκτύπωση, ή p, εντολή.
Έτσι, GDB μας λέει ότι num αποθηκεύει πράγματι 4, όπως περιμέναμε.
Το $ 1 ότι GDB είναι εκτυπώνει από μια ειδική μεταβλητή GDB
Αυτό είναι τώρα να αποθηκεύσετε το 4, καθώς και τον αριθμό.
Μπορείτε να αγνοήσετε αυτό για τώρα, αλλά αυτές οι μεταβλητές GDB έρχονται σε σούπερ βολικό
σε πιο προχωρημένες περιπτώσεις, όταν θέλετε να θυμάστε τι έχετε κάνει στο παρελθόν.
Τέλος πάντων, κινούνται με την επόμενη, βλέπουμε ότι έχουμε αρχίσει να κινείται μέσα από το βρόχο for.
Ας συνεχίσουμε από εδώ με λίγο n-σιγά.
Αντί να πληκτρολογείτε n κάθε φορά, μπορείτε επίσης απλά πατήστε enter.
Όταν πατήστε enter χωρίς να πληκτρολογήσετε τίποτα, GDB επαναλαμβάνει απλώς την προηγούμενη εντολή.
Έτσι τώρα έχουμε χτυπήσει το printf κλήση.
Μοιάζει όντως έχουμε περάσει από μας για βρόχο 4 φορές,
το οποίο είναι αυτό που θέλουμε να κάνουμε, ώστε να πολλαπλασιάζουμε με 1, 2, 3, και 4.
>> Τα πάντα φαίνεται σαν να δουλεύει,
εκτός όταν χτυπάμε επόμενη φορά θα έχουμε αυτό το τεράστιο αριθμό αντί για 24.
Αν εκτυπώσετε την αξία του παραγοντικό σ. χρήση,
βλέπουμε ότι παραγοντικό δεν έχει αυτό το τεράστιο αριθμό σε αυτό.
Κάτι σίγουρα πηγαίνει στραβά.
Σε αυτό το σημείο, όμως, είμαστε σχεδόν στο τέλος του προγράμματος,
και είναι πάρα πολύ αργά για να διορθώσετε κάτι.
>> Ωστόσο, μπορούμε να επανεκκινήσετε το πρόγραμμα πληκτρολογώντας r και πάλι και στη συνέχεια y για να επιβεβαιώσετε.
Τώρα είμαστε πίσω στο σημείο διακοπής μας κατά την έναρξη της κύριας.
Γνωρίζουμε ότι τα πάντα φαίνεται να είναι εντάξει με την ανάγνωση του ν.
ώστε να μπορούμε να βγαίνουμε μπροστά με n.
Εναλλακτικά, μπορούμε να ορίσουμε ένα νέο σημείο διακοπής μετά το κάνετε, ενώ βρόχο
και άλμα εκεί. Ας το κάνουμε αυτό.
Μοιάζει γραμμή 14 έρχεται αμέσως μετά το βρόχο.
Ας ορίσετε ένα breakpoint εκεί.
Είναι καλή πρακτική να καθορίσετε το όνομα του αρχείου σε αυτήν την εντολή breakpoint
από GDB μπορεί να μπερδευτείτε αν εργάζεστε με πολλά αρχεία.
Για να προχωρήσουμε από αυτό το σημείο διακοπής, θα χρησιμοποιήσουμε το continue ή γ εντολή.
>> Εντάξει, εδώ είμαστε στο βρόχο for.
Ας πάμε 1 επιπλέον γραμμή μέσα στο βρόχο for,
και στη συνέχεια θα αρχίσουμε μεταβλητές εκτύπωσης για να δείτε τι συμβαίνει.
Ας βεβαιωθείτε ότι το i είναι πράγματι 1, όπως αναμένεται.
Ναι, αυτό είναι όλα καλά.
Τι γίνεται με το παραγοντικό όμως;
Πω πω, που δεν είναι καλό.
Έχουμε ένα μεγάλο αρνητικό αριθμό εδώ.
Πως το να συμβεί αυτό;
Λοιπόν, αν κοιτάξουμε πίσω στο κώδικα,
βλέπουμε ότι δεν μπορούμε να προετοιμαστεί, έτσι έχουμε μόνο σκουπίδια εκεί.
Αυτό σίγουρα θα αποτινάξει τον υπολογισμό μας.
>> Ευτυχώς, δεν έχουμε να αφήσει GDB να το διορθώσω αυτό.
Μπορούμε να προετοιμαστεί εδώ και στερεώστε τον κωδικό αργότερα χρησιμοποιώντας την εντολή εκτύπωσης.
Θα γίνει η προετοιμασία στο 1 από τα παραγοντικών από το μηδέν και 1 είναι δύο 1,
και αν θέλουμε να προετοιμαστεί στο μηδέν, τότε θα είχαμε πάντα καταλήγουν με μηδέν ως αποτέλεσμα μας.
Μπορείτε να ρυθμίσετε κάθε μεταβλητή με τον τρόπο αυτό, το οποίο είναι εξαιρετικά βολικό.
Τώρα, ας συνεχίσουμε το πρόγραμμά μας.
Ας βεβαιωθείτε ότι όλα είναι όπου υποτίθεται ότι είναι.
Αριθμός θα πρέπει να είναι 4, i πρέπει να είναι 1, και παραγοντικό πρέπει να είναι 1 πάρα πολύ.
Μπορούμε να συντόμευση της διαδικασίας αυτής και εκτύπωση όλων των τοπικών μεταβλητών μας
με τα σούπερ-χρήσιμες πληροφορίες ντόπιοι εντολή,
η οποία εκτυπώνει όλα-σε έκταση τοπικές μεταβλητές μας.
Τέλος πάντων, αυτό μοιάζει με ό, τι είναι καλό να πάει.
>> Ας κάνουμε άλλη μια προσπάθεια-γύρω από το βρόχο για να είναι σίγουροι.
Εντάξει, τα πάντα φαίνεται μεγάλη.
Τώρα μπορούμε να χρησιμοποιήσουμε την εντολή continue για να πάει μέχρι το τέλος.
Γλυκό! 4 παραγοντικό εκτυπωθούν 24, όπως αναμενόταν.
Τώρα μπορούμε να πάμε να το διορθώσω αυτό το κωδικό μας.
Αντί να βγείτε από το GDB, θα χρησιμοποιήσουμε μια άλλη καρτέλα τερματικού να το κάνουμε αυτό.
Πηγαίνοντας πίσω στην καρτέλα GDB μας, πρέπει τώρα να μεταγλωττίσετε εκτελέσιμο μας.
Ένα από τα καλύτερα πράγματα για GDB είναι ότι δεν χρειάζεται να αφήσετε GDB να τρέξει κάνει.
Έτσι ώστε να μην κρατήσει χτυπούν τα παλιά σημεία διακοπής,
ας τους απενεργοποιήσετε με το, το μαντέψατε, απενεργοποιήστε την εντολή.
Αυτό θα απενεργοποιήσει όλες breakpoints μας.
Τώρα, μπορούμε να ξεκινήσουμε το πρόγραμμα με r και βεβαιωθείτε ότι όλα είναι εντάξει.
Μοιάζει με ό, τι είναι καλό να πάει.
Παραγοντικό από 4 εκτυπώνει 24, όπως νομίζαμε.
GDB είναι ένα από τα πιο χρήσιμα εργαλεία που έχετε στην εργαλειοθήκη σας.
>> Υπάρχουν ένα σωρό άλλα πράγματα που μπορείτε να κάνετε με το GDB,
πολύ περισσότερο από ό, τι μπορείτε να κάνετε με απλές εκτυπώσεις.
Την επόμενη φορά που το πρόγραμμά σας δεν κάνει ό, τι θέλετε,
προσπαθήστε να εκτελέσετε GDB να καταλάβω τι συμβαίνει στο εσωτερικό.
Με λίγη εξάσκηση, θα είστε σε θέση να τρυπάνι κάτω δεξιά στο σφάλμα σας σε κανέναν χρόνο.
Το όνομά μου είναι Nate Hardison. Αυτό είναι CS50.