
Ποια μνήμη διαρροή ανιχνευτές οι άνθρωποι είχαν μια καλή εμπειρία με;


Εδώ είναι μια περίληψη των απαντήσεων μέχρι τώρα:


[Valgrind](http://valgrind.org/) - Όργανα πλαίσιο για τη δημιουργία δυναμικών εργαλείων ανάλυσης.


[Ηλεκτρικό φράχτη](https://directory.fsf.org/project/ElectricFence/) - Ένα εργαλείο που λειτουργεί με GDB


[Νάρθηκας](http://splint.org/) - Σχολιασμός-Assisted Ελαφρύ Στατική Έλεγχος


[Λάμψη Κωδικός](http://www.glowcode.com/) - Αυτό είναι ένα πλήρες σε πραγματικό χρόνο τις επιδόσεις και τη μνήμη profiler για Windows και .NET προγραμματιστές που αναπτύσσουν εφαρμογές με ++, C, C #, ή οποιασδήποτε του .NET Framework


Επίσης, δείτε αυτό [μετά Stackoverflow](https://stackoverflow.com/questions/45627/how-do-you-detectavoid-memory-leaks-in-your-unmanaged-code) .

 
ανιχνευτές διαρροής μνήμης για C;
=================================



δεύτερη η [valgrind](http://valgrind.org/) ... και εγώ θα προσθέσω [ηλεκτρικό φράχτη](https://directory.fsf.org/project/ElectricFence/) .

 

[Valgrind](http://valgrind.org/) στο Linux είναι αρκετά καλή? Δεν έχω καμία εμπειρία στα Windows με αυτό.

 

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


[GlowCode](http://www.glowcode.com/)


[εντοπισμού σφαλμάτων σωρού](https://msdn.microsoft.com/en-us/library/974tc9t1(VS.80).aspx)

 

χνούδι (πολύ παρόμοιο εργαλείο ανοικτού κώδικα που ονομάζεται [νάρθηκας](http://splint.org/) )

 

Επώδυνη αλλά αν έπρεπε να χρησιμοποιήσετε ένα ..   

Θα ήθελα να συστήσω το [DevPartner BoundsChecker](http://www.borland.com/products/devpartner/read/) σουίτα .. αυτό είναι που οι άνθρωποι στο χώρο εργασίας μου χρήση για το σκοπό αυτό. Καταβάλλονται n ιδιόκτητο .. όχι δωρεάν.

 

Στο πανεπιστήμιο, όταν έκανα περισσότερα πράγματα κάτω από το Unix Solaris χρησιμοποίησα [gdb](https://www.gnu.org/software/gdb/) .


Ωστόσο, θα ήθελα να πάω με [valgrind](http://valgrind.org/) στο Linux.

 

Εγώ θα δεύτερη η valgrind ως ένα εξωτερικό εργαλείο για διαρροές μνήμης.   

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


Γιατί να χρησιμοποιήσετε το ήδη γράψει κώδικα, όταν μπορείτε να γράψετε τη δική σας :)


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


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

 

Για Win32 εντοπισμού σφαλμάτων των διαρροών μνήμης είχα πολύ καλές εμπειρίες με το απλό παλιό CRT εντοπισμού σφαλμάτων σωρού, που έρχεται ως lib με το Visual C.


Σε μια malloc εντοπισμού σφαλμάτων (κ.ά.) να επαναπροσδιοριστεί ως \_malloc\_dbg (κ.ά.) και υπάρχουν και άλλες κλήσεις για να ανακτήσετε τα αποτελέσματα, τα οποία είναι όλα απροσδιόριστο αν \_DEBUG δεν έχει οριστεί. Θέτει όλα τα είδη των συνοριακών φρουρών στο σωρό, και σας επιτρέπει να diplay τα αποτελέσματα ανά πάσα στιγμή.


Είχα μερικά ψευδή θετικά όταν ήμουν Witting κάποια στιγμή ρουτίνες που μπέρδεμα με τις βιβλιοθήκη κατανομές χρόνου εκτέλεσης έως ότου ανακάλυψα \_CRT\_BLOCK.


Έπρεπε να παράγουν τα πρώτα DOS, τότε Win32 κονσόλα και τις υπηρεσίες που θα τρέχει για πάντα. Απ 'όσο ξέρω δεν υπάρχουν διαρροές μνήμης, και τουλάχιστον ένα μέρος του κώδικα λειτουργίας για δύο χρόνια χωρίς επίβλεψη πριν από την οθόνη στον υπολογιστή απέτυχε (αν ο υπολογιστής ήταν μια χαρά!).

 

Ο παππούς από αυτά τα εργαλεία είναι το εμπορικό, κλειστού κώδικα [καθαρίζονται](http://unicomsi.com/products/purifyplus/) εργαλείο, το οποίο πωλήθηκε στην IBM και στη συνέχεια να UNICOM


Parasoft του [Ασφαλίστε ++](https://en.wikipedia.org/wiki/Insure%2B%2B) (πηγαίος κώδικας οργάνων) και valgrind (open source) είναι οι δύο άλλοι πραγματικοί ανταγωνιστές.


Trivia: ο αρχικός συντάκτης καθαρίζονται, Reed Hastings, πήγε για να βρεθεί NetFlix.

 

Εάν έχετε τα χρήματα: [IBM Rational Καθαρίστε](https://www-01.ibm.com/software/awdtools/purify/) είναι ένα εξαιρετικά ισχυρό διαρροή μνήμης βιομηχανία αντοχής και της μνήμης ανιχνευτή της διαφθοράς για την C / C ++. Υπάρχει για Windows, Solaris και Linux. Αν είστε linux μόνο και θέλουν μια φθηνή λύση, πάμε για Valgrind.

 

[Λασπωτήρα](https://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging) για gcc! Συντάσσει πραγματικά τους ελέγχους στο εκτελέσιμο. Απλά πρόσθεσε



```
-fmudflap -lmudflap

```

με σημαίες gcc σας.

 

Στα Windows, έχω χρησιμοποιήσει [Ανιχνευτής Visual διαρροών](https://vld.codeplex.com) . Ενσωματώνεται με VC ++, εύκολο στη χρήση (μόνο περιλαμβάνει μια κεφαλίδα και που LIB για να βρει το lib), ανοιχτού κώδικα, ελεύθερη να χρησιμοποιήσει FTW.

 

Επίσης, αξίζει να χρησιμοποιείτε αν είστε σε Linux χρησιμοποιώντας glibc είναι το ενσωματωμένο κώδικα εντοπισμού σφαλμάτων σωρού. Για να το χρησιμοποιήσετε, σύνδεση με **-lmcheck** ή να ορίσετε (και εξαγωγή) η **MALLOC\_CHECK\_** μεταβλητή περιβάλλοντος με την τιμή 1, 2 ή 3. [Το εγχειρίδιο glibc παρέχει περισσότερες πληροφορίες.](https://www.gnu.org/software/libtool/manual/libc/Heap-Consistency-Checking.html)


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

 

Μας [CheckPointer](http://www.semanticdesigns.com/Products/MemorySafety) εργαλείο μπορεί να κάνει αυτό για το GNU C 3/4 και, MS διαλέκτους της C, και Greenhills C. Μπορεί να βρείτε τα προβλήματα διαχείρισης μνήμης που Valgrind δεν μπορεί.


Αν κωδικό σας διαρροές απλά, κατά την έξοδο CheckPointer θα σας πω πού διατέθηκαν όλα τα unfreed μνήμη.

 

Είχα αρκετό χτυπήματα με [cppcheck](https://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page#Cppcheck_-_A_tool_for_static_C.2FC.2B.2B_code_analysis) , το οποίο κάνει μόνο στατική ανάλυση. Είναι open source και έχει μια διεπαφή γραμμής εντολών (εγώ δεν το χρησιμοποιούν με οποιοδήποτε άλλο τρόπο).

 

Κανείς δεν αναφέρθηκε [MSAN κλαγγή του](https://clang.llvm.org/docs/MemorySanitizer.html) , το οποίο είναι αρκετά ισχυρό. Είναι επίσημα υποστηρίζεται σε Linux μόνο, όμως.

 

Αυτή η ερώτηση ίσως παλιά, αλλά εγώ θα απαντήσω έτσι κι αλλιώς - ίσως η απάντησή μου θα βοηθήσει κάποιον να βρείτε διαρροές μνήμης τους.


Αυτό είναι το δικό μου έργο - το έχω βάλει ως ανοικτού πηγαίου κώδικα:


<https://sourceforge.net/projects/diagnostic/>


Τα Windows 32 & 64-bit πλατφόρμες που υποστηρίζονται, οι μητρική και μικτές callstacks λειτουργία υποστηρίζεται.


.NET συλλογή σκουπιδιών δεν υποστηρίζεται. (Gcnew C ++ CLI ή C # 's νέα)


Το εργαλείο υψηλής απόδοσης, και δεν απαιτεί την ένταξη (εκτός αν θέλετε πραγματικά να το ενσωματώσουν).


Πλήρεις οδηγίες μπορείτε να βρείτε εδώ:


<http://diagnostic.sourceforge.net/index.html>


Μην φοβάστε για το πόσο ανιχνεύει πραγματικότητα διαρροές ότι η διαδικασία σας. Πιάνει διαρροές μνήμης από την όλη διαδικασία. Αναλύστε μόνο μεγαλύτερες διαρροές, δεν είναι όλα.

 