VS2010 Premium: Aktuellen Speicherverbrauch
-
Hallo,
ich habe eine multithread-C++ Anwendung, diw während des Betriebs immer mehr Speicher verbraucht. Wenn ich die normalen Marcos / Tools verwendete, bekomme ich die Information, das am Programmende der gesamte Speicher wieder freigegeben wurde.
Wie kann man sich die Speicherbelegung während des Programmlaufs anschauen. Ich würde gerne einen Breakpoint setzen und mir dann die Speicherbelegung anschauen.
Ich verwende das Visual Studio 2010 Premium, gibt es dort diese Möglichkeit oder gibt es irgendwelche Tools?
Gruss
Lars
-
Am "einfachsten" geht dies mit UMDH aus den "Debugging Tools for Windows"...
http://msdn.microsoft.com/en-us/library/windows/hardware/ff560206
-
Danke für die Info...
Dann werde ich mir einmal das Windows SDK für Windows XP installieren und mal sehen wie weit ich mit UMDH komme.
Gruss
Lars
-
Die CRT hat dutzende Helferlein hierfür:
http://msdn.microsoft.com/en-US/library/wc28wkas(v=vs.80).aspx
-
Guten Morgen Martin,
diese Helferlein kenne ich. Wenn ich diese Helferlein verwende, kann ich feststellen, daß zum Ende des Programms aller Speicher wieder freigegeben wird und sich somit kein Speicherleck, das durch ein fehlendes delete/free verursacht wird, vorhanden ist.
Nur der Speicherverbrauch des Programms steigt unregelmäßig in 8k Schritten an.
Deshalb will ich analysieren, welche Objekte zu bestimmten Zeitpunkten Speicher allokiert haben.Hoffe, ich habe mich verständlich ausgedrückt.
Gruss
Lars
-
möglicherweise beobachtest du auch nur die Speicherfragmentierung. das tritt besonders dann auf, wenn man viele kleine Objekte häufig ändert
http://www.google.de/#output=search&sclient=psy-ab&q=c%2B%2B+speicherfragmentierung+Stroustrup
-
ja, das mit der Speicherfragmentierung könnte sein. Mithilfe von umdh erstelle
ich mir inzwischen Logs, die mir anzeigen, wie die aktuelle Heapbelegung ist.
Während die Speicherauslastung im Windows Task-Manager um 4k steigt, liefert mir umdh folgendes Ergebnis.Total decrease == 0 requested + 0 overhead = 0
Sieht für mich nach Speicherfragmentierung. Oder?
Gruss
Larsdd++ schrieb:
möglicherweise beobachtest du auch nur die Speicherfragmentierung. das tritt besonders dann auf, wenn man viele kleine Objekte häufig ändert
http://www.google.de/#output=search&sclient=psy-ab&q=c%2B%2B+speicherfragmentierung+Stroustrup
-
mit UMDH kenne ich mich jetzt im Detail nicht so aus, aber wenn solche Debugging Tools kein Memory Leak melden, dann liegt es wohl an der Fragmentierung
unter WinXP muß man den LFH selber aktivieren, vielleicht verbessert sich da ja etwas
-
Schonmal daran gedacht das es gar nicht an new-Aufrufen liegt sondern an irgendwelchen Kernel-Objekten die du nicht richtig freigibst?
-
An was für Kernelobjekte denkst du? Die Anwendung hat eine minimale MFC-Oberfläche und verwendet sonst nichts Windows-spezifisches. Es kommt eine spezielle Datenbank zum Einsatz. Es werden Critcalsections verwendet, ansonsten nur normaler C++ Code mit boost.
Gruss
Larshmm. schrieb:
Schonmal daran gedacht das es gar nicht an new-Aufrufen liegt sondern an irgendwelchen Kernel-Objekten die du nicht richtig freigibst?
-
Habe gerade versucht die LFH einzuschalten. Bekomme aber den Fehlercode 31 (= A device attached to the system is not functioning) von GetLastError zurück.
Auch in der Release-Version.
Gruss
Larsdd++ schrieb:
mit UMDH kenne ich mich jetzt im Detail nicht so aus, aber wenn solche Debugging Tools kein Memory Leak melden, dann liegt es wohl an der Fragmentierung
unter WinXP muß man den LFH selber aktivieren, vielleicht verbessert sich da ja etwas