GCC Speicherleckerkennung entspricht Microsoft crtdbg.h?
Nach vielen Jahren der Arbeit an einem general-purpose-C++ - Bibliothek unter Verwendung der Microsoft MSVC-compiler in Visual Studio, wir sind jetzt Portierung auf Linux/Mac OS X (beten für uns). Inzwischen habe ich mich daran gewöhnt und ganz lieb die einfache memory-leak-detection-Mechanismus in MSVC:
#ifdef DEBUG
#define _CRTDBG_MAP_ALLOC
#define NEW new( _NORMAL_BLOCK, __FILE__, __LINE__)
#include <stdlib.h>
#include <crtdbg.h>
#else
#define NEW new
#endif
Jeder Speicherreservierung erfolgt mit dieser NEUEN makro. Wenn ein Prozess mit unserer Bibliothek beendet, keine Speicher-Lecks (Blöcke, die nicht de zugeordnet) sind auf der Konsole gemeldet, zusammen mit der Datei und Zeile, wo der Speicher war ursprünglich zugeordnet wurde.
Den Teil über das, was ich mag, ist, dass ich nicht aktiv "run with performance tool" oder auf andere Weise zeigen, dass ich bin auf der Suche nach Lecks. Lecks sind, haben mir berichtet, in den regelmäßigen Gang der Entwicklung, jedes mal, wenn ein Prozess beendet wird.
Nun, wir bewegen uns auf der GCC-Welt finde ich, dass die memory-leak-detection-tools, viele davon sind Recht anspruchsvoll, Sie verlangen, dass ich explizit darauf hinweisen, dass ich bin in Leck-Jagd-Modus. Meine IDE ist Xcode und ich sah in einige der Zuweisung/leak detection tools (wie Instrumente und MallocDebug) aber ich gebe zu, ich habe nicht verbrachte die Zeit in meinen Kopf zu kriegen, Sie voll und ganz noch. Ich immer abgeschreckt von der Tatsache, dass ich eigentlich angeben, dass ich bin auf der Suche nach einem Leck vor der Zeit, anstatt alarmiert es automatisch.
Ich bin mit Xcode 3.2 und ich höre, dass es jetzt raffinierte integration mit statischen Analyse-tool, aber wieder, ich habe nicht in diese sah. Ich bin auf der Suche einige Idee, was meine Optionen sind. Gibt es einen vergleichbaren Mechanismus integriert GCC und/oder Xcode? Gibt es eine einfache third-party Bibliothek oder Werkzeug führt, dass die grundlegende Funktionalität, die ich kennen und lieben? Oder sollte ich saugen Sie sich und lernen Sie die neue Art, Dinge zu tun?
InformationsquelleAutor der Frage Gene Goykhman | 2009-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie einen Blick auf "Cross-Plattform-Speicher-Leck-Detektor", sieht sehr ähnlich wie die crtdbg.h-Technik.
InformationsquelleAutor der Antwort Cristian Adam
Haben Sie eine Reihe von Optionen zur Verfügung.
Ersten, und die meisten im Volksmund, Sie können Ihre Anwendung ausführen, unter Werkzeuge wie Valgrind. Sollten Sie auf eine Reihe von Speicher-Missbrauch, wie NULL-pointer liest und schreibt und Speicher-Lecks. Es gibt eine Reihe von tools zur Verfügung, in der Valgrind-suite, so sicher sein, Sie heraus zu überprüfen.
Zweite, Sie können eine Bibliothek verwendet, die LD_PRELOAD trick. Im Grunde, die LD_PRELOAD-trick ermöglicht DLL injection, was bedeutet, dass tools erstellt werden können, um zu helfen verfolgen Sie Ihre memory-Nutzung in Ihrer Anwendung, ohne etwas zu ändern. Finden Sie Werkzeuge, wie dmalloc und efence zu sein, sehr umfangreich in die debug-Möglichkeiten, die Sie bieten.
Schließlich neuere GCC-Versionen enthalten ein tool namens Schmutzfänger. Diese im Grunde verwendet die Funktion Instrumentierung zu wickeln Anrufe rund um die gleichen Speicher-Funktionen, dmalloc, efence und Valgrind. Das Programm wird deutlich langsamer, und kann abgestimmt werden, zur Laufzeit, aber es sieht noch immer aus wie es hat viel Potenzial.
Ich habe alle drei und fand Valgrind sehr nützlich zu sein. Ich war sehr daran interessiert, mit Schmutzfänger, wie gut, obwohl ich nicht in der Lage zu noch.
InformationsquelleAutor der Antwort s1n
Möglicherweise finden Sie auch die MALLOC_CHECK_-Umgebungsvariable nützlich.
Von malloc(3) man-Seite:
InformationsquelleAutor der Antwort grigy
Vielleicht könnten Sie die Boehm garbage collector als leak detection tool:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
Aus der Website:
(Sie erhalten eine Benachrichtigung per stderr)
InformationsquelleAutor der Antwort akosch
Ich bin mir nicht bewusst irgendetwas "built-in", die tut, was Sie beschreiben, aber es scheint nicht so, als wäre es sehr schwer, "roll your own" version dieses. Sie wollen einfach nur Ihre debugging-neue Datensatz den Zeiger, Datei und Zeile in einer
map<void*, AllocationInfo>
wo der Schlüssel ist die zugewiesene Zeiger und der Wert (AllocationInfo
) wäre eine Struktur, die enthält den Dateinamen, die Zeilennummer, etc. Sie müssen auch, um eine benutzerdefinierte delete-operator, der prüft die Karte für den Zeiger wird gelöscht. Wenn gefunden, dieser Eintrag wird aus der map entfernt. Dann auf Prozess beenden Zeit, die Sie emittieren, den Inhalt der Karte.Fand ich eine Seite, wo jemand beschreibt, die Ihre eigenen home-grown-system, dass so funktioniert.
InformationsquelleAutor der Antwort Laurence Gonsalves
Ich hatte das gleiche problem als wir anfingen Portierung auf den Mac. "Run with performance tool -> Löcher" war die einzige, die ich gefunden und ich bin weniger begeistert ... zumindest im Vergleich zu CRTDEBUG. Ich verstehe, es gibt einige Optionen (wie beschrieben von anderen hier), aber irgendwann, da sind wir multi-Plattform verwenden wir Windows, sich für die Lecks.
Da Sie erwähnen die statische Analyse. Wir verbrachten einige Zeit damit, herauszufinden, heiß, um es laufen, bis wir festgestellt, dass es nur funktioniert der C aber nicht in C++
InformationsquelleAutor der Antwort Nicholaz