2016-11-10 4 views
-1

Ich möchte eine C++ - Funktion (mit WIN32-API) implementieren, um die aktuelle Speichernutzung meines Prozesses zu erhalten.So überprüfen Sie die Speicherauslastung

Ich überprüfte Code von diesem Beitrag How to determine CPU and memory consumption from inside a process? und implementierte die Funktion.

bool GetMemoryUsage(size_t& usageInBytes) 
{ 
    PROCESS_MEMORY_COUNTERS_EX pmc; 
    if (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, sizeof(pmc))) 
    { 
     usageInBytes = pmc.WorkingSetSize; 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Allerdings, wenn ich versuche, es zu testen, wie folgt aus:

size_t initialMemoryUsage = 0; 
GetMemoryUsage(initialMemoryUsage); 

size_t use = 596; 
void* memUsed = malloc(use); 

size_t memoryUsage = 0; 
GetMemoryUsage(memoryUsage); 
assert(memoryUsage == initialMemoryUsage + 596); 

free(memUsed); 

GetMemoryUsage(memoryUsage); 
assert(memoryUsage == initialMemoryUsage); 

Es schlägt fehl:

  • Wenn GetMemoryUsagepmc.WorkingSetSize verwendet, memoryUsage größer als initialMemoryUsage von 12288 und befreien Speicher tut nicht verringern
  • Wenn GetMemoryUsageverwendet, memoryUsage und initialMemoryUsage sind alle gleich, auch nachdem ich einige Speicher zugewiesen

Wie kann ich GetMemoryUsage auf eine genaue und zuverlässige Art und Weise implementieren, um die Prüfung über den Ball zu haben?

+1

Ihre Erwartungen darüber, wie Prozesse Speicher verwenden, sind einfach falsch. Die Ergebnisse, die Sie erhalten haben, sind korrekt und zeigen Ihnen, was tatsächlich passiert. –

+0

OK, also gibt es eine Möglichkeit zu wissen, wann etwas Speicher zugewiesen wurde und wie viel? Oder ist das einfach unmöglich? – jpo38

+1

Es hängt davon ab, was Sie mit "Speicher" meinen und was Sie mit "allokiert" meinen. Sie sehen gerade, wann Speicher zugewiesen ist und wie viel. Es ist einfach nicht die Art von Erinnerung, die du denkst. (Physisch? Virtual? Reserviert? Resident? Oder was?) Und es ist nicht "zugeordnet" wie Sie denken. (Reserviert? Mapped? Enthält nützliche Daten? Oder was?) Ohne genau zu wissen, was Sie zu tun versuchen, ist es schwer, Ihnen dabei zu helfen. Auf welche Frage antwortest du? Sei so genau wie du kannst. –

Antwort

0

Eigentlich möchte ich zur Laufzeit überprüfen, dass ein bestimmter Funktionsaufruf kein Speicherleck einführt. Ich möchte überprüfen, ob der von der Funktion zugewiesene Speicher freigegeben wurde. Also muss ich irgendwann wissen, wie viel Speicher von new/malloc zugewiesen wurde und noch nicht freigegeben wurde.

Tut mir leid, es funktioniert einfach nicht so.

std::string foo() 
{ 
    return "hello"; 
} 

Wenn diese Funktion zurückkehrt, kann es eine neue std::string sein, die es vorher nicht gab. Das deutet nicht auf ein Leck hin.

Sie haben Erwartungen, wie Software funktioniert, aber nicht, wie Software funktioniert.

Ich denke, Sie würden es fruchtbarer finden, zu sehen, wie Programmierer typischerweise Speicherlecks debuggen. Ein sehr häufiger Fehler, den Menschen machen, wenn sie um Hilfe bei der Lösung eines Problems bitten, ist, dass sie auf eine Art und Weise kommen, auf der sie denken, dass das Problem gelöst werden sollte und um Hilfe bitten, damit sie zur Arbeit kommen. Das machst du gerade.

Beschreiben Sie stattdessen Ihr tatsächliches Problem so detailliert wie möglich und bitten Sie Experten, Vorschläge zu machen, wie sie denken, dass Sie sie lösen sollten. Sie schlagen eher Wege vor, die funktionieren werden.

+0

Alles in Ordnung. Hier ist meine Problembeschreibung. Ich habe VLD verwendet, um Speicherlecks in einer kritischen Funktion unseres Systems zu erkennen und zu beheben. Um sicherzugehen, dass kein Entwickler in der Zukunft neue Leaks einführt, möchte ich einen neuen Komponententest zu unserer Systemtestsuite hinzufügen, der die Funktion aufruft und prüft, ob die Heapnutzung durch den Aufruf nicht erhöht wurde. Das Testsystem integriert VLD nicht und kann den Heap-CRT-Checker von Microsoft nicht verwenden, wenn Tests im Freigabemodus ausgeführt werden. Also würde ich gerne eine Funktion haben, die die Heap-Nutzung irgendwann überprüft. – jpo38

+0

Sie können eine separate Frage stellen, um mehr Sichtbarkeit zu erhalten. Aber ich denke nicht, dass das ohne Änderungen an Ihrer Umgebung einfach ist. Sie haben entschieden, alle Instrumente und Werkzeuge, die dies erkennen würden, spezifisch zu deaktivieren. Die Release-Versionen des Heapspeichers speichern diese Informationen nicht genau, weil sie Kosten verursachen. Vielleicht kennt jemand einen Weg - vielleicht einen instrumentierten Heap, den Sie in einen Release-Build einbinden können? –

+0

Übrigens würde mir eine nette Antwort erklären, warum 'pmc.WorkingSetSize' um 12288 erhöht wird, nachdem ich ein' malloc (596) 'gemacht habe ... ;-) – jpo38

Verwandte Themen