Speicherfehler - tools zum herausfinden
-
Sorry vergessen zu erwähnen brauch ich für Windows:D
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
asc schrieb:
drakon schrieb:
Gibt es eigentlich unter Windows etwas vergleichbares, das entweder kostenlos ist, oder zumindestens im unteren Preissegment liegt?
cu André
Ne, da gibts nichts
-
visual leak detector
-
@CrazyPlaya: Klar gibts sowas für Windows, nennt sich BoundsChecker. Kostet aber $$$.
@asc: gratis/billig kenn ich leider auch nix.
-
Upps kann es sein, dass bei Antworten keine Mails mehr versendet werden.
Vom BoundsChecker habe ich auch bereits gehört ist aber definitv zu teuer.
@ztrewfnvc: Ist das Tool günstig?
Ansonsten mal die Frage wie wäre das sinnvollste Vorgehen bei der Suche nach Speicherlecks?
Quellcode einige 10T Zeilen. Programm von jemand anders übernommen, natürlich ohne Kommentare:).Gruß
CrazyPlaya
-
Hi,
meine eigene Erfahrung ist, daß man bei fremden Quelltext am besten mit Kommentieren beginnt (so man denne die Zeit hat). Danach hat man meist einigermaßen den Durchblick. Manchmal ist auch wegwerfen und neuschreiben die effizientere Lösung.
Ansonsten, erst mal rausfinden, in welcher Datei der Fehler liegt. (Beim Betreten und verlassen hinweis in LogDatei schreiben).
Danach in der betroffenen Datei alle Funktionen Hinweise in Logdatei schreiben lassen (wichtig, immer Logdatei öffnen, ans Ende schreiben und Logdatei wieder schleißen). Ist ein bisschen Arbeit aber müsste zum Ziel führen.
Das ganze kann man mit Copy und Paste an den Anfang jeder Funktion einfügen (zum Beispiel als Hinweis ANGANG, der vom Präprozessor jeweils mit nichts oder einem speziellen Funktionsaufruf ersetzt wird).
Wenn man garantieren kann, daß immer die erste und nur die erste öffnende Klammer einer Funktion direkt am Zeilenbeginn steht, kann man das Einfügen sogar mit einem kleinen Programm machen das Zeilenschaltung + { gegen Zeilenschaltung + { + ANFANG ersetzt.Gruß Mümmel
-
Der Visual Leaks Detector ist ne feine Sache. Sehr zu empfehlen.
Dank an ztrewfnvc für den Tipp.
@muemmel: So ungefähr habe ich das auch angesetzt. Lag ich ja gar nicht so falsch. Habe aber das mit dem ANFANG nicht gemacht. Ansonsten genauso vor gegangenüberal wo speicher reserviert wird wird ein Kommentar in ein Logfile geschrieben und der dazugehörige freisetzen des Speichers auch. Inkl. Hinweis wozu der Speicher gebraucht wurde bzw. welche Werte in ihm aufgenommen wurden.
So lässt sich evtl auch herausfinden ob ein Speicehr irgendwo nicht freigeben und genullt wurde.
-
Waere es was die Zeiger durch auto_ptr oder shared_ptr zu ersetzen? Ansonsten kannst du einfach einen GC zum Programm hinzufuegen (wenn es den moeglich ist).
-
Klar wäre es was durch auto_ptr zu ersetzen. Ist immer schöner. Aber auch ein ebenfalls ein ziemlicher Aufwand.
Gute Frage ob das möglich ist mit dem gc. Aber visual leak detector hat das Leck bereits gefunden, hoffe ich zumindest:).
Aber der Absturz bleibt aus.
-
@CrazyPlaya:
Wenn du MSVC verwendest kannst du auch einfach beim Programmende einen Dump ausgeben lassen.
Da stehen dann alle Allokationen inklusive ID (fortlaufende Nummer der Allokation) drinnen welche nicht wieder freigegeben werden.Informationen dazu findest du in der MSDN unter "Debug Heap".
Mit der ID der Allokation (pick dir einfach eine aus der Mitte des Dumps raus) kannst du dann oft schon draufkommen wo diese passiert ist, denn du kannst dem Debug Heap sagen dass er bei der Allokation mit der ID XYZ brechen soll, dann siehst du genau die Stelle wo das passiert.
Funktioniert natürlich nur wenn sich die genaue Reihenfolge der Allokationen nicht ändert bis zu dem Punkt wo das Leak auftritt. Also bei interaktiven Applikationen meist nur in der Init-Phase, bei anderen Programmen geht es meist sehr schön.
-
Hi,
wenn Du jede einzelne Logausgabe eindeutig identifizierst, z.B. über Zeilennummer und Dateiname, und das ganze in eine Datenbank schreibst, wo Du Anforderungen und Freigaben jeweils in einem getrennten Feld hochzählst, dann brauchst Du eigentlich nur noch die Datensätze raussuchen, wo anforderungen nicht mit Freigaben übereinstimmen.
Gruß Mümmel