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




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


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


[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) .
δεύτερη η [valgrind](http://valgrind.org/) ... και εγώ θα προσθέσω [ηλεκτρικό φράχτη](https://directory.fsf.org/project/ElectricFence/) .
Η καλύτερη εξήγηση που έχω δει είναι στο κεφάλαιο 7 των ελεύθερων [Ιδρύματα Προγραμματισμού e-book](http://codebetter.com/karlseguin/2008/06/25/foundations-of-programming-ebook/) .


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


Θα γνωρίζετε ότι έχετε διαρροές όταν ξεκινάτε να πάρει OutOfMemoryExceptions ή τη χρήση της μνήμης σας ανεβαίνει πέρα από αυτό που θα περίμενε κανείς ( **PerfMon** έχει ωραία μετρητές μνήμης).


Κατανόηση **ΝΕΤ** μοντέλο μνήμης «s είναι ο καλύτερος τρόπος για σας να αποφευχθεί αυτό. Συγκεκριμένα, την κατανόηση του πώς λειτουργεί ο συλλέκτης σκουπιδιών και πώς αναφορές λειτουργούν - και πάλι, σας παραπέμπω στο κεφάλαιο 7 του e-book. Επίσης, να λαμβάνει υπόψη της τις κοινές παγίδες, ίσως τα πιο κοινά είναι τα γεγονότα. Εάν το αντικείμενο **Α** έχει καταχωρηθεί σε μια εκδήλωση στο αντικείμενο **Β** , τότε αντιρρήσεις **Α** θα μείνω μέχρι το αντικείμενο **Β** εξαφανιστεί λόγω **B** κατέχει αναφορά στο **Α** . Η λύση είναι να καταργήσετε τις εκδηλώσεις σας, όταν τελειώσετε.


Φυσικά, ένα καλό προφίλ μνήμης θα σας αφήσει να δείτε το αντικείμενο γραφήματα σας και να εξερευνήσετε το φώλιασμα / αναφορά των αντικειμένων σας για να δείτε πού είναι οι αναφορές προέρχονται από και ποια ρίζα αντικείμενο είναι υπεύθυνος ( [προφίλ μυρμήγκια κόκκινο-πύλη](http://www.red-gate.com/products/ants_memory_profiler/index.htm) , JetBrains dotMemory, [memprofiler](http://memprofiler.com/) είναι πραγματικά καλό επιλογές, ή μπορείτε να χρησιμοποιήσετε το κείμενο-μόνο **WinDbg** και **SOS** , αλλά θα ήθελα να συνιστούμε ένα εμπορικό / οπτική του προϊόντος, εκτός αν είστε ένας πραγματικός γκουρού).


Πιστεύω μη διαχειριζόμενο κώδικα υπόκειται σε τυπικό διαρροές μνήμης, εκτός από το ότι μοιράζονται τις αναφορές που διαχειρίζεται τον συλλέκτη σκουπιδιών. Μπορεί να κάνω λάθος σχετικά με αυτό το τελευταίο σημείο. Για C ++, [Boost.Random](http://www.boost.org/libs/random/) είναι ίσως ό, τι ψάχνετε. Έχει υποστήριξη για MT (μεταξύ πολλών άλλων αλγορίθμων), και να συλλέγουν εντροπία μέσω της `nondet_random`κατηγορίας. Τσέκαρέ το! :-) **Καλύτερο που έχετε να κάνετε:**


* Η μίσθωση ενός άντρα ασφαλείας για την ανάλυση του πηγαίου κώδικα
* Δεύτερο καλύτερο πράγμα που κάνει την πρόσληψη ενός / pentesting εταιρεία τύπος ασφαλείας για την ανάλυση μαύρο κουτί


**Μετά τα εργαλεία θα βοηθήσουν:** 


* Στατική Εργαλεία Ανάλυσης οχυρώσουν Εργαστήρια / ουγγιά - Κωδικός κριτική
* Σκεφτείτε λύσεις όπως είναι η ασφαλής αντικείμενο (VS.NET addon) WebInspects της HP
* Αγοράζοντας ένα σαρωτή εφαρμογή blackbox όπως Netsparker, AppScan, WebInspect, Hailstorm, Acunetix ή δωρεάν έκδοση του [Netsparker](http://www.mavitunasecurity.com/communityedition/)


Πρόσληψη κάποιο ειδικό ασφάλειας είναι πολύ καλύτερη ιδέα (θα κοστίσει περισσότερο αν) επειδή δεν θα βρείτε μόνο ένεση και τεχνικά ζητήματα, εφόσον ένα αυτοματοποιημένο εργαλείο για να βρείτε, θα βρείτε επίσης όλα τα λογικά θέματα. Θα ήθελα να συστήσω σίγουρα [Weka](http://www.cs.waikato.ac.nz/ml/weka/) το οποίο είναι ένα *Open Source λογισμικό εξόρυξης δεδομένων* γραμμένο σε Java:



> 
> Weka είναι μια συλλογή από αλγόριθμους μηχανικής μάθησης για εργασίες εξόρυξης δεδομένων. Οι αλγόριθμοι μπορούν είτε να εφαρμοστούν άμεσα σε ένα σύνολο δεδομένων ή καλείται από το δικό σας κώδικα Java. Weka περιέχει εργαλεία για τα δεδομένα προ-επεξεργασία, ταξινόμηση, παλινδρόμηση, ομαδοποίηση, κανόνες συσχέτισης, και την απεικόνιση. Είναι επίσης κατάλληλη για την ανάπτυξη νέων συστημάτων μηχανικής μάθησης.
> 
> 
> 


Όπως αναφέρθηκε παραπάνω, τα πλοία με μια δέσμη των διαφορετικών ταξινομητών όπως [SVM](http://en.wikipedia.org/wiki/Support_vector_machine) , [Winnow](http://en.wikipedia.org/wiki/Winnow_%28algorithm%29) , [C4.5](http://en.wikipedia.org/wiki/C4.5_algorithm) , Naive Bayes (φυσικά) και πολλά άλλα (βλέπε την [doc API](http://weka.sourceforge.net/doc/) ). Σημειώστε ότι πολλές ταξινομητές είναι γνωστό ότι έχουν **πολύ καλύτερη παράσταση από Naive Bayes** στον τομέα της ανίχνευσης spam ή ταξινόμησης κειμένου.


Επιπλέον Weka σας φέρνει ένα πολύ [ισχυρό γραφικό περιβάλλον](http://www.cs.waikato.ac.nz/~ml/weka/gui_explorer.html) ... Δεν είμαι σίγουρος αν αυτό βοηθάει (βρήκα την τεκμηρίωση ccnet κάπως άχρηστη κατά καιρούς):


[Χρησιμοποιώντας CruiseControl.NET με MSTest](http://confluence.public.thoughtworks.org/display/CCNET/Using+CruiseControl.NET+with+MSTest) Γνωρίζω τουλάχιστον ένα ζευγάρι πόρων. Πρώτον, υπάρχει ένα πολύ χρήσιμο άρθρο στο MSDN με τίτλο [Κρατήστε κώδικα σας να λειτουργεί με την αξιοπιστία χαρακτηριστικά του .NET Framework](http://msdn.microsoft.com/en-us/magazine/cc163716.aspx) .


Ο Chris Brumme είχε επίσης μια [θέση για τη φιλοξενία](http://blogs.msdn.com/cbrumme/archive/2004/02/21/77595.aspx) , όταν τα χαρακτηριστικά της αξιοπιστίας είχαν σχεδιαστεί. Αυτό μπορεί να δώσει μερικές χρήσιμες πληροφορίες υποβάθρου


Οι όροι αναζήτησης που μπορείτε να βρείτε χρήσιμες περιλαμβάνουν «High Availability» «CER» και «Περιορισμένη Περιφερειών Εκτέλεση».


Καλή τύχη! Πραγματικά διαθέσιμα κώδικας είναι πολύ δύσκολο τα πράγματα. :) Eric νεροχύτη έχει μια [εξαιρετική σειρά](http://www.ericsink.com/scm/source_control.html) για τον έλεγχο του πηγαίου κώδικα απευθύνονται σε αρχάριους. Για λεπτομέρειες Subversion, συμπεριλαμβανομένης της καθιέρωσης και της διαχείρισης ενός διακομιστή, το [βιβλίο Subversion](http://svnbook.red-bean.com/) είναι μια μεγάλη πηγή, και περιλαμβάνει ένα τμήμα με παραδείγματα από μια τυπική συνεδρία με το Subversion (checkout, διαπράττουν, συγχώνευση και βασικά ενημέρωση).


**Ενημέρωση:** Ξέχασα να αναφέρω ότι για αρχάριους, θα ήθελα επίσης να συστήσει Messing περίπου σε ένα γραφικό πελάτη, η οποία αφαιρεί την παρενόχληση της γραμμής εντολών από την εμπειρία εκμάθησης. [RapidSVN](http://rapidsvn.tigris.org/) είναι μια λογική πελάτη cross-platform. Θα βρείτε επίσης ότι κοινή IDEs είτε έρχονται με την υποστήριξη Subversion, ή έχουν plugins που μπορούν να εγκατασταθούν, οι οποίες επιτρέπουν περισσότερες λειτουργίες ελέγχου έκδοση που πρέπει να εκτελεστούν μέσα σε αυτό το περιβάλλον.


**@John Millikin:** Ενώ η δημιουργία ενός διακομιστή Subversion μπορεί να είναι περίπλοκη, ανάλογα με τη γενική εμπειρία κάποιου διαχειριστή, μην ξεχνάτε ότι δεν χρειάζεται να το κάνουμε αυτό ακριβώς να χάνω την ώρα μου με ένα αποθετήριο και να ασχοληθούμε με τα βασικά - το πελάτης μπορεί να αλληλεπιδράσει με ένα αποθετήριο στο τοπικό σύστημα αρχείων. Εδώ είναι μια καλή Best Practices που γράφτηκε από τη Microsoft. Κεφάλαιο 6 είναι ειδικά για ASP.NET, αλλά ολόκληρο το έγγραφο .NET γενικότερα.


* <http://msdn.microsoft.com/en-us/library/ms998530.aspx> [SmartPaster](http://weblogs.asp.net/alex_papadimoulis/archive/2004/05/25/Smart-Paster-1.1-Add-InStringBuilder-and-Better-C_2300_-Handling.aspx) - (FREE) Copy / Paste γεννήτρια κώδικα για έγχορδα


[AnkhSvn](http://ankhsvn.open.collab.net/) - (FREE) Ολοκλήρωση ελέγχου SVN Πηγή VS.NET


[VisualSVN διακομιστή](http://www.visualsvn.com/server/) - (FREE) Έλεγχος Πηγή


[ReSharper](http://www.jetbrains.com/resharper/index.html) - ενίσχυση IDE που βοηθά με refactoring και την παραγωγικότητα


[CodeRush](http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/) - Κωδικός gen μακροεντολές στα στεροειδή


[Refactor](http://www.devexpress.com/Products/Visual_Studio_Add-in/Refactoring/) - Κωδικός ενίσχυση refactoring


[CodeMaid](http://www.codemaid.net/) (FREE) - Κωδικός καθαρισμό, την οργάνωση και την πολυπλοκότητα ανάλυση


[Codesmith](http://www.codesmithtools.com/) - Γεννήτρια κώδικα


[GhostDoc](http://www.roland-weigelt.de/ghostdoc/) - (FREE) Απλό κωδικό σχολιάζοντας εργαλείο


[DXCore](http://www.devexpress.com/Downloads/Visual_Studio_Add-in/DXCore/) (χωρίς χρέωση) και πολλά φοβερό plugins του: [DxCore Κοινότητα Πρόσθετα](http://code.google.com/p/dxcorecommunityplugins/) , [CR\_Documentor](http://code.google.com/p/cr-documentor/) , [CodeStyleEnforcer](http://joel.fjorden.se/static.php?page=CodeStyleEnforcer) , [RedGreen](http://www.rorybecker.me.uk/DevExpress/Plugins/Community/RedGreen/) Μια λύση, η οποία είναι ένα hack περιορισμένης χρησιμότητας, είναι όταν ξεκινά μια έλξη, την αποθήκευση των δεδομένων έσυραν σε μια παγκόσμια ή στατική αναφοράς κάπου. Με αυτό τον τρόπο, στην OnEnter και OnDragOver χειριστές, είναι δυνατόν να πάρετε μια αναφορά στα δεδομένα που σέρνεται. Αυτό είναι φυσικά μόνο χρήσιμα για σέρνει μέσα στην ίδια εφαρμογή (την ίδια παρουσία της εφαρμογής, στην πραγματικότητα).