Πώς να βρείτε την αιτία του σφάλματος τμηματοποίησης στη C++

Pos Na Breite Ten Aitia Tou Sphalmatos Tmematopoieses Ste C



Ένα σφάλμα τμηματοποίησης, γνωστό και ως σφάλμα τμηματοποίησης, είναι ένα είδος σφάλματος που συμβαίνει όταν ένα πρόγραμμα προσπαθεί να φτάσει σε ένα τμήμα μνήμης στο οποίο δεν έχει εξουσιοδότηση πρόσβασης. Όταν παρουσιαστεί σφάλμα κατάτμησης, το λειτουργικό σύστημα τερματίζει το πρόγραμμα για να αποτρέψει την πρόκληση περαιτέρω προβλημάτων. Αυτό το σφάλμα συνήθως υποδεικνύει ένα σφάλμα ή ένα σφάλμα προγραμματισμού στον κώδικα του προγράμματος, όπως η πρόσβαση σε έναν μη αρχικοποιημένο δείκτη, η κατάργηση αναφοράς ενός μηδενικού δείκτη ή η υπέρβαση των ορίων ενός πίνακα.

Τα σφάλματα τμηματοποίησης μπορεί να είναι δύσκολο να εντοπιστούν σφάλματα, επειδή συχνά οδηγούν σε σφάλματα χωρίς να παρέχουν λεπτομερή μηνύματα σφάλματος. Ωστόσο, εργαλεία όπως το GDB (GNU Debugger) μπορούν να βοηθήσουν στον εντοπισμό της πηγής του σφάλματος κατάτμησης εξετάζοντας την κατάσταση του προγράμματος και το ίχνος στοίβας τη στιγμή του σφάλματος.

Είναι σημαντικό να σημειωθεί ότι τα σφάλματα τμηματοποίησης συνήθως προκαλούνται από σφάλματα προγραμματισμού και θεωρούνται σφάλματα. Θα πρέπει να διορθωθούν με έλεγχο και διόρθωση του προβληματικού κώδικα. Οι συνήθεις αιτίες των σφαλμάτων κατάτμησης περιλαμβάνουν:







  • Αποαναφορά των μηδενικών ή μη αρχικοποιημένων δεικτών
  • Γράψιμο ή ανάγνωση έξω από τα όρια ενός πίνακα
  • Χρήση μνήμης που έχει προηγουμένως εκχωρηθεί ή απελευθερωθεί
  • Υπερχείλιση στοίβας ή καταστροφή στοίβας
  • Χρήση μη αρχικοποιημένων μεταβλητών

Εξετάζοντας προσεκτικά τον κώδικά σας και χρησιμοποιώντας εργαλεία εντοπισμού σφαλμάτων όπως το GDB, μπορείτε να εντοπίσετε και να διορθώσετε τα σφάλματα τμηματοποίησης, διασφαλίζοντας ότι το πρόγραμμά σας λειτουργεί σωστά και δεν αντιμετωπίζει αυτά τα σφάλματα.



GDB Debugger

Το GDB (GNU Debugger) είναι ένα ισχυρό εργαλείο εντοπισμού σφαλμάτων που βοηθά στον εντοπισμό και την ανάλυση των προβλημάτων σε μεταγλωττισμένα προγράμματα, συμπεριλαμβανομένων των σφαλμάτων κατάτμησης. Σας δίνει τη δυνατότητα να εξετάσετε την κατάσταση του προγράμματος, να ενεργοποιήσετε τα σημεία διακοπής και να παρατηρήσετε τη ροή εκτέλεσης.



Για να χρησιμοποιήσετε αποτελεσματικά το GDB για τον εντοπισμό σφαλμάτων των σφαλμάτων κατάτμησης, πρέπει να μεταγλωττίσετε το πρόγραμμά σας C++ με τα ενεργοποιημένα σύμβολα εντοπισμού σφαλμάτων. Αυτά τα σύμβολα περιλαμβάνουν πρόσθετες πληροφορίες σχετικά με τη δομή, τις μεταβλητές και τις λειτουργίες του προγράμματος που βοηθούν στη διαδικασία εντοπισμού σφαλμάτων.





Εύρεση του σφάλματος τμηματοποίησης στη C++ με το GDB

Ακολουθεί ένα παράδειγμα αποσπάσματος κώδικα που προκαλεί σφάλμα τμηματοποίησης:

#include

ενθ κύριος ( ) {

ενθ * πτρ = nullptr ;

* πτρ = 5 ;

ΕΠΙΣΤΡΟΦΗ 0 ;

}

Ας εξηγήσουμε πρώτα τον κώδικα. Στη συνέχεια, θα συζητήσουμε σε βήματα για την εύρεση ενός σφάλματος τμηματοποίησης στον προηγούμενο κώδικα.



Η οδηγία προεπεξεργαστή '#include ' προσθέτει το απαιτούμενο αρχείο κεφαλίδας που προσφέρει τα χαρακτηριστικά εισόδου καθώς και τα χαρακτηριστικά ροής εξόδου στη C++.

Μέσα στη συνάρτηση main(), υπάρχει μια δήλωση μιας μεταβλητής δείκτη 'ptr' τύπου int*. Η τιμή 'nullptr' χρησιμοποιείται ως αρχικοποίηση του δείκτη που είναι μια ειδική τιμή μηδενικού δείκτη που υποδεικνύει ότι δεν δείχνει σε κανένα έγκυρη θέση μνήμης.

Οι προσπάθειες αναφοράς γίνονται με τον μηδενικό δείκτη 'ptr' στην ακόλουθη γραμμή που είναι '*ptr = 5;'. Σε αυτήν την περίπτωση, καθώς το 'ptr' έχει οριστεί σε 'nullptr', δεν υπάρχει έγκυρη θέση μνήμης για πρόσβαση.

Τώρα, θα συζητήσουμε ορισμένα βήματα που πρέπει να υιοθετηθούν για τη σύνταξη του προγράμματος προκειμένου να βρεθεί το σφάλμα τμηματοποίησης.

Βήμα 1: Ενεργοποιήστε τα σύμβολα εντοπισμού σφαλμάτων

Για να ξεκινήσετε, φροντίστε να μεταγλωττίσετε το πρόγραμμα C++ με τα ενεργοποιημένα σύμβολα εντοπισμού σφαλμάτων. Για να παρέχετε τις πληροφορίες εντοπισμού σφαλμάτων στο εκτελέσιμο αρχείο κατά τη μεταγλώττιση, χρησιμοποιήστε τη σημαία '-g'. Εξετάστε την περίπτωση όπου έχουμε ένα αρχείο C++ που ονομάζεται 'main.cpp'.

$ g++ -σολ κύρια.cpp κύριος

Βήμα 2: Εκτελέστε το GDB

Μόλις το πρόγραμμα έχει μεταγλωττιστεί με σύμβολα εντοπισμού σφαλμάτων, εκτελέστε το GDB περνώντας το εκτελέσιμο αρχείο ως όρισμα.

$ gdb κύριος

Βήμα 3: Ξεκινήστε το πρόγραμμα

Ξεκινήστε το πρόγραμμα πληκτρολογώντας 'run' ή 'r' στη γραμμή εντολών GDB:

$ ( gdb ) τρέξιμο

Στη συνέχεια, το πρόγραμμά σας θα αρχίσει να εκτελείται.

Βήμα 4: Προσδιορίστε το σφάλμα τμηματοποίησης

Το πρόγραμμα συνεχίζει να εκτελείται μέχρι να αντιμετωπίσει ένα σφάλμα κατάτμησης. Στη συνέχεια, το πρόγραμμα σταματά να εκτελείται και το GDB παράγει ένα μήνυμα σφάλματος.

Για παράδειγμα: ας εξετάσουμε τον κώδικα που εξηγήθηκε προηγουμένως, όπου όταν προσπαθούμε να εκχωρήσουμε την τιμή 5 στη θέση μνήμης που δείχνει ο μηδενικός δείκτης, οδηγεί σε σφάλμα τμηματοποίησης. Το πρόγραμμα τερματίζεται αμέσως στη γραμμή όπου παρουσιάζεται το σφάλμα κατάτμησης.

Όταν εκτελείτε αυτό το πρόγραμμα με το GDB, θα δείτε μια παρόμοια έξοδο με την ακόλουθη:

Αυτή η έξοδος υποδεικνύει ότι παρουσιάστηκε σφάλμα τμηματοποίησης στην κύρια συνάρτηση στη γραμμή 5 του αρχείου 'main.cpp'.

Βήμα 5: Εξετάστε το Stack Trace

Για να αποκτήσετε περισσότερες πληροφορίες σχετικά με το σφάλμα τμηματοποίησης, μπορείτε να εξετάσετε το ίχνος στοίβας χρησιμοποιώντας την εντολή 'backtrace' ή απλά 'bt'. Αυτή η εντολή εμφανίζει τη σειρά των κλήσεων συνάρτησης που οδηγεί στη συντριβή.

$ ( gdb ) bt

Εμφανίζεται το ίχνος στοίβας που υποδεικνύει τις συναρτήσεις που καλούνται πριν από το σφάλμα τμηματοποίησης:

Αυτή η έξοδος μας λέει ότι το σφάλμα τμηματοποίησης παρουσιάστηκε στην κύρια συνάρτηση στη γραμμή 5 του αρχείου 'main.cpp'.

Βήμα 6: Ορίστε τα σημεία διακοπής

Για περαιτέρω διερεύνηση, μπορείτε να ορίσετε τα σημεία διακοπής σε συγκεκριμένες γραμμές κώδικα για να σταματήσετε την εκτέλεση του προγράμματος σε αυτά τα σημεία. Αυτό σας επιτρέπει να επιθεωρήσετε την κατάσταση και τις μεταβλητές του προγράμματος. Για παράδειγμα, για να ορίσετε ένα σημείο διακοπής στη γραμμή 5 του 'main.cpp', χρησιμοποιήστε την εντολή 'break' ως εξής:

$ ( gdb ) Διακοπή main.cpp: 5

Αυτό ορίζει ένα σημείο διακοπής στη γραμμή 5 του αρχείου 'main.cpp':

Βήμα 7: Συνέχιση της εκτέλεσης

Αφού ορίσετε τα σημεία διακοπής, συνεχίστε την εκτέλεση του προγράμματος χρησιμοποιώντας την εντολή 'continue' ή απλά 'c':

$ ( gdb ) να συνεχίσει

Το πρόγραμμα συνεχίζει να τρέχει μέχρι να φτάσει στο σημείο διακοπής.

Βήμα 8: Επιθεωρήστε τις μεταβλητές και τον κώδικα

Μόλις το πρόγραμμα σταματήσει σε ένα σημείο διακοπής, μπορείτε να χρησιμοποιήσετε διάφορες εντολές GDB για να εξετάσετε τις μεταβλητές, να προχωρήσετε στον κώδικα και να διερευνήσετε την αιτία του σφάλματος τμηματοποίησης.

Βήμα 9: Κλείστε το GDB

Μόλις ολοκληρώσετε τον εντοπισμό σφαλμάτων, μπορείτε να βγείτε από το GDB χρησιμοποιώντας την εντολή 'quit':

$ ( gdb ) εγκαταλείπω

Αυτό παρέχει μια βασική επισκόπηση της χρήσης του GDB για την εύρεση των σφαλμάτων τμηματοποίησης στα προγράμματα C++. Το GDB παρέχει πολλές περισσότερες δυνατότητες και εντολές που μπορούν να βοηθήσουν στον εντοπισμό σφαλμάτων και μπορείτε να ανατρέξετε στην τεκμηρίωση του GDB για πιο αναλυτικές πληροφορίες.

συμπέρασμα

Αυτό το άρθρο δείχνει τη χρήση του GDB για την εύρεση του σφάλματος τμηματοποίησης στη C++. Σας εξηγήσαμε τα βήματα που πρέπει να ακολουθήσετε. Αυτά τα βήματα παρέχουν μια ολοκληρωμένη εξήγηση σχετικά με τον τρόπο εύρεσης ενός σφάλματος τμηματοποίησης στη C++ χρησιμοποιώντας το GDB. Ακολουθώντας αυτά τα βήματα και χρησιμοποιώντας τις δυνατότητες του GDB, μπορείτε να εντοπίσετε και να διορθώσετε αποτελεσματικά την πηγή του σφάλματος τμηματοποίησης στο πρόγραμμά σας C++.