Πώς μπορείτε να χρησιμοποιήσετε το _crtBreakAlloc για τον εντοπισμό σφαλμάτων σε μια εκχώρηση μνήμης


Σύνοψη


Κατά τον εντοπισμό διαρροών μνήμης με τη χρήση του εντοπισμού σφαλμάτων C-Runtime (CRT), είναι συχνά χρήσιμο να ορίσετε ένα σημείο διακοπής αμέσως πριν από την εκχώρηση της μνήμης που προκαλεί τη διαρροή. Ορίζοντας _crtBreakAlloc είτε σε χρόνο μεταγλώττισης είτε σε χρόνο εκτέλεσης, μπορείτε να προκαλέσετε ένα σημείο διακοπής καθορισμένο από το χρήστη σε ένα συγκεκριμένο σημείο εκχώρησης μνήμης.

Περισσότερες πληροφορίες


Κατά την παρακολούθηση διαρροών μνήμης με συναρτήσεις debug-CRT, όπως _CrtDumpMemoryLeaks, εμφανίζεται συχνά ένας αριθμός εκχώρησης που περικλείεται σε άγκιστρα ({}). Για παράδειγμα, η παρακάτω είναι μια διαρροή μνήμης στον αριθμό εκχώρησης 18:
   Detected memory leaks!   Dumping objects ->   {18} normal block at 0x00660BE4, 10 bytes long   Data: <          > CD CD CD CD CD CD CD CD CD CD   Object dump complete. 
Είναι χρήσιμο να ορίζετε ένα σημείο διακοπής ακριβώς πριν εκχωρηθεί αυτή η μνήμη, ώστε να μπορείτε να περάσετε μέσα από το κλήσεων και να δείτε ποιες συναρτήσεις προκαλούν την εκχώρηση αυτής της μνήμης. Η συνάρτηση debug-CRT _CrtSetBreakAlloc που σας επιτρέπει να καθορίσετε έναν αριθμό εκχώρησης στον οποίο θα κάνετε την αλλαγή. Αυτή η μέθοδος απαιτεί να μεταγλωττίσετε ξανά το πρόγραμμά σας κάθε φορά που θέλετε να καθορίσετε ένα σημείο διακοπής εκχώρησης. Μια εναλλακτική μέθοδος είναι να χρησιμοποιήσετε το παράθυρο παρακολούθηση και να καθορίσετε το σημείο διακοπής εκχώρησης δυναμικά. Αυτή η μέθοδος έχει το πλεονέκτημα ότι δεν απαιτεί αλλαγές πηγαίου κώδικα ή μεταγλώττιση. Εάν δημιουργείτε στατική σύνδεση με το χρόνο εκτέλεσης C, η μεταβλητή που θέλετε να αλλάξετε ονομάζεται _crtBreakAlloc. Εάν δημιουργείτε δυναμική σύνδεση με το χρόνο εκτέλεσης C, η μεταβλητή που θέλετε να αλλάξετε στο παράθυρο παρακολούθησης είναι {, msvcr40d. dll} * __p__crtBreakAlloc () Εάν χρησιμοποιείτε το Visual C++ 4,0 ή 4,1. Η μεταβλητή που θέλετε να αλλάξετε στο παράθυρο παρακολούθησης πρέπει να είναι {, msvcrtd. dll} * __p__crtBreakAlloc () Εάν χρησιμοποιείτε το Visual C++ 4,2 ή νεότερη έκδοση. Για να προσδιορίσετε ποια έκδοση του CRT με την οποία καταρτίζετε:
  1. Από το μενού Δόμηση, επιλέξτε ρυθμίσεις.
  2. Στο παράθυρο ρυθμίσεις για:, επιλέξτε τη ρύθμιση παραμέτρων για την οποία δημιουργείτε. Επιλέξτε την καρτέλα C/C++ και, στη συνέχεια, επιλέξτε την κατηγορία δημιουργία κώδικα.
Το παράθυρο διαλόγου χρήση βιβλιοθήκης χρόνου εκτέλεσης πρέπει να εμφανίζεται εμφανίζοντας την έκδοση του CRT που χρησιμοποιείτε. (Εάν αυτή η ρύθμιση είναι κενή, βεβαιωθείτε ότι έχετε επιλέξει μόνο μία ρύθμιση παραμέτρων στο παράθυρο ρυθμίσεις για:.) Για να καθορίσετε ένα σημείο διακοπής εκχώρησης δυναμικά, εκτελέστε τα παρακάτω βήματα:
  1. Ξεκινήστε την περίοδο λειτουργίας εντοπισμού σφαλμάτων. Από το μενού Δόμηση, επιλέξτε debug-> βήμα-βήμα. Εάν χρησιμοποιείτε το "debug single-threaded" ή "debug multi-threaded CRT", ακολουθήστε το βήμα 1α. Διαφορετικά, ακολουθήστε το βήμα 1β.
    1. Πληκτρολογήστε _crtBreakAlloc στο παράθυρο παρακολούθησης. Αυτό εμφανίζει τον τρέχοντα αριθμό εκχώρησης στον οποίο θα διακοπεί το πρόγραμμά σας. Αυτός ο αριθμός εκχώρησης θα πρέπει να είναι-1 όταν ξεκινά το πρόγραμμά σας για πρώτη φορά.
    2. Πληκτρολογήστε {,, msvcr40d. dll} * __p__crtBreakAlloc () στο παράθυρο παρακολούθησης, εάν χρησιμοποιείτε το Visual C++ 4,0 ή 4,1. Πληκτρολογήστε {,, msvcrtd. dll} * __p__crtBreakAlloc () Εάν χρησιμοποιείτε το Visual C++ 4,2 ή νεότερη έκδοση. Αυτό εμφανίζει τον τρέχοντα αριθμό εκχώρησης στον οποίο θα διακοπεί το πρόγραμμά σας. Αυτός ο αριθμός εκχώρησης θα πρέπει να είναι-1 όταν ξεκινά το πρόγραμμά σας για πρώτη φορά.
  2. Κάντε διπλό κλικ στην τιμή-1 και πληκτρολογήστε τον νέο αριθμό εκχώρησης που προκαλεί ένα σημείο διακοπής που ορίζεται από το χρήστη.
  3. Από το μενού debug, επιλέξτε debug-> Go.
Για περισσότερες πληροφορίες σχετικά με το _crtBreakAlloc, ανατρέξτε στο θέμα "παρακολούθηση αιτήσεων εκχώρησης σωρού" στην ηλεκτρονική βοήθεια.