2009-06-27 6 views
11

Weiß jemand, wo ich ein Speicher-Lecksuche-Tool für C++ finden kann, die entweder in einer Befehlszeile oder als ein Eclipse-Plug-in in Windows und Linux ausgeführt werden kann. Ich möchte, dass es einfach zu bedienen ist. Vorzugsweise eine, die new(), delete(), malloc() oder free() nicht überschreibt. Etwas wie GDB, wenn es in der Befehlszeile sein wird, aber ich erinnere mich nicht daran, dass es zum Erkennen von Speicherlecks verwendet wird. Wenn es ein Unit-Test-Framework gibt, das das automatisch macht, wäre das großartig.G ++ Multi-Plattform-Speicher-Lecksuche-Tool

Diese Frage ist ähnlich wie bei anderen Fragen (wie Memory leak detection under Windows for GNU C/C++), aber ich denke, es ist anders, weil diejenigen fragen für Windows spezifische Lösungen oder Lösungen haben, die ich lieber vermeiden würde. Ich denke, ich suche hier nach etwas Bestimmterem. Vorschläge müssen nicht alle Anforderungen erfüllen, aber so viele wie möglich wären nett.

Danke.

EDIT: Da dies mit "überschreiben" gemeint ist, meine ich alles, was erfordert, dass ich eine Bibliothek einschließe oder was anderswie ändert, wie C++ meinen Code kompiliert, wenn es dies zur Laufzeit tut, damit der Code ausgeführt wird Eine andere Umgebung beeinflusst nichts, was großartig wäre. Außerdem habe ich leider keinen Mac, also sind irgendwelche Vorschläge dafür nicht hilfreich, aber danke, dass du es versuchst. Mein Desktop läuft Windows (Ich habe Linux installiert, aber meine Dual-Monitore arbeiten nicht damit) und ich würde lieber nicht Linux in einer VM ausführen, obwohl das sicherlich eine Option ist. Mein Laptop läuft unter Linux, daher kann ich das Tool dort verwenden, obwohl ich es vorziehen würde, auf meinem Desktop zu bleiben, da der Platz auf dem Bildschirm hervorragend dafür geeignet ist, alle Designdokumentationen und Anforderungen im Blick zu behalten, ohne sich auf dem Desktop bewegen zu müssen .

HINWEIS: Während ich Antworten versuchen kann, werde ich nicht eins als akzeptiert markieren, bis ich den Vorschlag ausprobiert habe und es ist zufriedenstellend.

EDIT2: Ich mache mir keine Sorgen über die plattformübergreifende Kompatibilität meines Codes, es ist eine Befehlszeilenanwendung, die nur die C++ - Bibliotheken verwendet.

Antwort

10

Valgrind ist Ihre best friend. Valgrind hat eine plugin für Eclipse. "Leider" Valgrind läuft nicht unter Windows, aber es läuft auf Mac OSX, * BSD und Linux, also würde ich das als "Multi-Plattform" betrachten. :)

Valgrind "überschreibt" new/delete/malloc/free, aber nicht während der Kompilierung (Sie müssen also nicht neu kompilieren, wenn Sie das meinen). Es interpretiert die Binärdatei, so dass die Leistung beim Testen etwas leidet.

0

Es gibt das Tool leaks auf MacOS X (ich weiß nicht, ob es woanders existiert) und ich verwendete ein Werkzeug namens meprof auf Linux. Es gibt auch Valgrind, das auf Linux arbeitet und unglaublich witzig ist, aber einen beachtlichen Performance-Hit hat, und angeblich auf Macos, aber ich habe es nicht ausprobiert.

Mir sind solche Tools unter Windows jedoch nicht bekannt.

1

Für 32-Bit-Anwendungen kann valgrind + wine auch für Windows-Apps eine funktionierende Lösung sein. Wenn deine App ohne Änderung unter Wein betrieben werden kann, dann funktioniert es unter Valgrind + Wein gut in meiner (ziemlich begrenzten) Erfahrung. Da Ihre App unter Linux läuft, würde ich vermuten, dass Ihre App wahrscheinlich unter Wein läuft (vermeidet sehr Windows-spezifischen Code, der noch nicht in Wein unterstützt wird).

+0

Sie meinen, die Windows-App auf * nix mit Wine als API-Implementierung neu zu kompilieren? (Ich bin nur neugierig) – olliej

+0

Valgrind funktioniert für x86_64 sowie PowerPC, MIPS, ARM und andere Architekturen. – LiraNuna

+0

Nein, ich meine das Ausführen Ihrer Windows-Binärdatei, unmodifiziert, auf Linux unter dem Wein selbst unter valgrind. Deshalb habe ich nur 32 Bits erwähnt: Valgrind kann keine Anwendungen unter Wein mit 64 Bit Unterstützung ausführen, und Wein mit 64 Bit Unterstützung ist experimentell (um 64 Bit, ich meine 64 Bit Windows Apps) –

1

Während Sie erwähnt haben, dass dies nicht bevorzugt ist, kann die Boehm Garbage Collector verwendet werden, um Speicherlecks zu erkennen. Einfach gesagt, wenn der Garbage Collector tatsächlich läuft, dann haben Sie im Allgemeinen einen Speicherleck. Es wird auf diese Weise von Mozilla verwendet, um Speicherlecks in Firefox zu erkennen.

1

DUMA ist eine plattformübergreifende Lecksuche-Bibliothek, die ich für viele meiner Projekte verwenden. Es ist nett, weil Sie keinen DUMA-spezifischen Header #include haben müssen, aber verknüpfen Sie einfach in der Bibliothek, bevor Sie in der libc Ihres Systems verknüpfen, die die Speicherzuordnungsroutinen enthält, und nach dem Verknüpfen in libstdC++.

Es kann etwas schwierig sein, einzurichten, vor allem, wenn mit C++ - Projekten verwendet, aber ich denke, dass es die investierte Zeit lohnt. Es hat mir geholfen, ein paar Speicherlecks zu finden, bevor ich es nicht anders gefunden hätte, und einen Fall, in dem ich eine Zuweisung zweimal gelöscht habe.

Ein Hinweis: Es ist viel einfacher, wenn Sie ein statisches Archiv (standardmäßig unter Windows erstellt) erstellen, da es hilft, "falsche Positive" zu reduzieren, die tatsächlich durch undichte Laufzeiten verursacht werden.

0

In neueren Versionen von gcc gibt es etwas namens Leck Desinfektionsmittel. Sie müssen nur -fsanitize=leak hinzufügen, um den Befehl zu kompilieren. Dann führen Sie Ihr Programm normal und am Ende, wenn es ein Leck gab, erhalten Sie eine Zusammenfassung (natürlich im Terminal).