Speicherverbrauch mit Qt-Mitteln anzeigen

Alles rund um die Programmierung mit Qt
Antworten
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Speicherverbrauch mit Qt-Mitteln anzeigen

Beitrag von Tilman Räger »

Hallo,

Sicher ein Thema, was schon hundertfach angefragt wurde, aber vermutlich sind mir die passenden Suchwörter nicht eingefallen - daher hier:

In meiner Anwendung scheint der Speicherbedarf langsam aber stetig zuzunehmen. Nun wollte ich an einzelnen Stellen im Programm einmal den Speicherverbrauch mitloggen.
Mein Problem: wie das ganze unter Linux läuft ist kein Thema - nur, wie kriege ich das ganze unter Windows (7) hin.

Danke

Tilman (Räger)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Speicherverbrauch mit Qt-Mitteln anzeigen

Beitrag von Christian81 »

Speicherlecks wirst Du damit sicher nicht finden können. Für sowas gibt es valgrind und unter Windows nur irgendwelche kommerziellen Tools.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Speicherverbrauch mit Qt-Mitteln anzeigen

Beitrag von brax »

Um Speicherleaks zu finden hat das Visual Studio schon etwas eingebaut: http://msdn.microsoft.com/en-us/library ... 80%29.aspx (In dem Artikel steht zwar Visual Studio 2005, es funktioniert so aber auch für neuere Versionen).

Eine weitere Möglichkeit ist es selbst new und delete zu überschreiben und so alle Allokationen/Freigaben zu tracken. Das könnte z.B. so aussehen (quick and dirty und ungetestet!):

Code: Alles auswählen

QHash<void*,QPair<QString,int> > allocations;
QHash<void*,size_t> allocSpace;

bool tracking=false;

void traceAlloc(void* ptr,size_t s,const char* file,int line) {
        if (!tracking) return;
	allocations[ptr] = qMakePair<QString,int>(file,line);
	allocSpace[ptr] = s;
}
void traceFree(void* ptr) {
        if (!tracking) return;
	allocations.remove(ptr);
	allocSpace.remove(ptr);
}

inline void* operator new(size_t s,const char* file,int line) {
	void* ptr = malloc(s);
	traceAlloc(ptr,s, file, line);
	return(ptr);
}

inline void __cdecl operator delete(void * _ptr) {
  traceFree(ptr);
  free(ptr);
}

inline void __cdecl operator delete[](void * _ptr) {
  traceFree(ptr);
  free(ptr);
}

void startAllocTracing() {
   allocations.clear();
   allocSpace.clear();
   tracking = true;
}

void endAllocTracing() {
   tracking = false;
}

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

Da werden durch das Macro am Ende alle Aufrufe von new im Code durch den new-Operator mit Datei und Zeile ersetzt und jeweils in die Map eingetragen. Du brauchst dann natürlich noch irgendwelche Funktionen, die Dir die gespeicherten Daten auswerten...
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Re: Speicherverbrauch mit Qt-Mitteln anzeigen

Beitrag von Tilman Räger »

Hallo,

Danke erst mal für die bisherigen Antworten. Allerdings bin ich beim Versuch, diesen hier zu verwenden erst einmal auf die Schnauze gefallen.
Um Speicherleaks zu finden hat das Visual Studio schon etwas eingebaut: http://msdn.microsoft.com/en-us/library ... 80%29.aspx (In dem Artikel steht zwar Visual Studio 2005, es funktioniert so aber auch für neuere Versionen).
Nach einfügen dieser Zeilen (lt. obigem Link)

Code: Alles auswählen

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
lässt sich die Anwendung nicht mehr compilieren. Muss ich auch die ganze Qt-Bibliothek damit übersetzten? Auf jeden Fall haut er mir diverse stellen in div. Qt-Headern um die Ohren, in erster Linie wg.
fehlerhaftem Aufruf des Macros realloc. Oder reicht es vielleicht, sicherzustellen, dass die Qt-Header vor diesen MS headern eingebunden werden?

Gruss
Tilman
Tilman Räger
Beiträge: 189
Registriert: 6. Juni 2007 15:23
Wohnort: Göttingen

Re: Speicherverbrauch mit Qt-Mitteln anzeigen

Beitrag von Tilman Räger »

Hallo,

ich habe mir jetzt mal - wie in einem der Kommentare zur oben verlinkten MS -Seite empfohlen, den Visual Leak Detector heruntergeladen und installiert. Nach einigen Problemen mit der Einbindung (offensichtlich mag VS nicht wirklich gerne Pfadangaben mit Leer- / Sonderzeichen, der Standardpfad "C:/Programme (x86)/Visual Link Detector/lib/Win32" war jeden falls zu hoch für ihn, als ich das Programm woanders installiert hatte (C:/VLD) lief alles problemlos.

Das Ende vom Lied - nach Beseitigung von 7 gefunden Memory-Leak kam endlich die meldung
'no memory leaks detected'

gefolgt von einer langen Liste (gefühlt > 100) von Leaks eingeleitet mit der Schönen Meldung ' ERROR: Visual Leak Detector: Detected a memory lead internal to Visual Leak Detector'

Wenn das mal nicht vertrauenerweckend ist :lol:

Trotzdem - schlecht ist das Tool wohl nicht. Die Meldungen waren alle korrekt und anhand der Angaben gut zu finden :-)


Trotzdem bleibt das Problem, das mein Programm continuierlich wächst, mglw. durch irgendwelche Variablen, die er anlegt und korrekt löscht, allerdings erst beim endgültigen Verlassen des Programms. (möglicherweise irgendwelche QObject-Abkömmlinge, die mit new XYZ(<Parent>) angelegt wurden. Die werden dann ja, wenn der Parent abgeräumt wird, wohl ebenfalls mit entsorgt - sind aber, vom Programmlauf her eigentlich echte Memoryleaks.
Gibt es irgendeine Möglichkeit, (bevorzugt unter Windows, möglich ist aber auch LInux) so etwas herauszufinden. Mglw. C-Lint o.ä.

Gruss
Tilman (Räger)
Antworten