2009-08-10 8 views
3

Guten Tag alle,wie finden zugewiesenen Speicher in Linux

Was ich versuche zu erreichen: Ich möchte eine Erweiterung auf eine C++ Einheit Testvorrichtung implementieren, um festzustellen, ob der Test Speicher reserviert und befreit es nicht. Meine Idee war, Zuweisungslevel oder freie Speicherlevels vor und nach dem Test aufzuzeichnen. Wenn sie nicht übereinstimmen, verlieren Sie Speicher.

Was ich bisher versucht habe: Ich habe eine Routine geschrieben /proc/self/stat lesen die vm Größe und Resident Set Größe zu erhalten. Die Größe des Residents scheint mir das zu sein, was ich brauche, aber es ist offensichtlich nicht richtig. Es wechselt zwischen aufeinanderfolgenden Aufrufen der Funktion ohne Speicherzuweisung. Ich glaube, dass es den zwischengespeicherten Speicher zurückgibt, der nicht verwendet wird, was zugeteilt wird. Es ändert sich auch in 4k-Schritten, so dass es zu grob ist, um wirklich nützlich zu sein.

Ich kann die Stapelgröße durch Zuweisen eines lokalen und Speichern der Adresse erhalten. Gibt es Probleme damit?

Gibt es eine Möglichkeit, um wirklich freien oder allozierten Speicher auf Linux zu bekommen?

Dank

+0

Es ändert sich in 4k-Schritten, da dies die Standard-Seitengröße unter Linux ist. Der Speicher wird einem Prozess auf Seiten zugewiesen, nicht Byte für Byte. Wenn Sie also über den gesamten Speicherverbrauch Ihres Prozesses sprechen, ist das nicht grobkörnig, sondern es passiert wirklich etwas. –

+0

Wenn es zeigt mir 4k Seiten des Arbeitsspeichers verwendet und ich lecke 100 Bytes Ich sehe wahrscheinlich keine Änderung in der Anzahl der 4k Seiten, die ich benutze. Deshalb habe ich gesagt, dass es für diese Anwendung zu grobkörnig ist. – Jay

+0

Speicher wird wahrscheinlich nie zum Betriebssystem zurückgeschickt, bis die Anwendung beendet wird, so dass die Überprüfung der verwendeten Menge kein praktikabler Test ist. Hinweis: Die Anwendung empfängt Speicher in Teilen von 4K, verwaltet diese Seite jedoch, bis sie beendet wird. Der Speicher kann mehrfach zugewiesen und freigegeben werden, ohne jemals zum Betriebssystem zurückzukehren. –

Antwort

3

Ich würde denen zustimmen müssen, die Valgrind und ähnliche vorschlagen, aber wenn der Laufzeitaufwand zu groß ist, kann eine Option mallinfo() Aufruf verwenden, Statistiken für derzeit zugeordneten Speicher abzurufen, und überprüfen, ob uordblks nicht Null ist .

Beachten Sie, dass dies ausgeführt werden muss, bevor globale Destruktoren aufgerufen werden. Wenn Sie also über Zuweisungen verfügen, die dort bereinigt werden, wird dies als false positive registriert. Es wird Ihnen auch nicht sagen, wo die Zuordnung vorgenommen wird - aber es ist ein guter erster Durchlauf, um herauszufinden, welche Testfälle funktionieren müssen.

+1

Das ist einfach, leicht und schnell. Mit dem GNU-Compiler wird die Aufgabe sowohl für Neu- als auch für Malloc erledigt. Es ist eine gute Möglichkeit, schnell auf den Code aufmerksam zu machen, der Aufmerksamkeit erfordert. Ich bin sicher, mit Hilfe von Valgrind wird es meinen Code viel besser machen. Kudos! – Jay

+0

@Jay Berücksichtigt es auch alle Arten von Zuweisungen (STL und objektspezifische neue/löschende Operatoren)? –

+1

@GuyAvraham So weit ich weiß C++, STL, und neu/löschen alle verwenden die Standard-Zuweisungsmethoden mit Betriebssystemaufrufen. Ohne umfangreiche Nachforschungen wäre es wahrscheinlich. – Jay

0

keine direkte Antwort, aber man konnte die :: neu und :: löscht Operatoren und intern neu definieren entweder über einen Singleton oder globale Objekte, verfolgen die zugeordnet, und de-zugewiesenen Speicher .

Bearbeiten: Wenn dies ein persönliches, DIY-Projekt ist, dann cool. Aber wenn es für etwas Kritisches ist, kann man immer auf eine der vielen verfügbaren Leckerkennungs-Bibliotheken/Programme springen, eine schnelle Google-Suche sollte ausreichen.

+0

Ich hatte Hoffnungen, es gab eine leichte, einfache Antwort. Ich würde gerne die Geräteprüfung einfach und schnell durchführen. Valgrind sieht ziemlich gut aus, wenn ich nicht etwas leichter finde. Danke – Jay

4

Ihre beste Wette könnte tatsächlich ein Werkzeug sein, das speziell für die Suche nach Speicherlecks entwickelt wurde. Ich habe persönliche Erfahrung mit Electric Fence, die einfach zu bedienen ist und scheint die Arbeit gut zu machen (nicht sicher, wie gut es mit C++ umgehen wird). Auch von anderen empfohlen ist Dmalloc.

Natürlich scheint jeder zu mögen Valgrind, die fast alles tun kann und sogar Front-Ends hat (obwohl alles, was ein Front-End dafür gebaut hat bedeutet, dass es wahrscheinlich nicht die einfachste Sache in der Welt). Wenn die KDE Leute es empfehlen können, muss es in der Lage sein, fast alles zu behandeln. (Ich sage nichts Schlechtes über KDE, nur dass es eine sehr große C++ - Codebasis ist, also wenn Valgrind mit KDE-Software umgehen kann, muss etwas dafür sorgen. Obwohl ich keine persönlichen Erfahrungen damit als Electric Fence habe war immer genug für mich)

+3

Ich würde Valgrind definitiv dafür empfehlen. Es ist ein sehr leistungsfähiges Werkzeug und relativ einfach zu bedienen. Um Lecks zu finden, müssen Sie nur "valgrind --tool = memcheck --leak-check = full ./TestProgram args" ausführen und den Bericht lesen. – Falaina

+0

Ich stimme zu - machen Sie Ihr Unit-Test-Skript führen Sie das Programm unter valgrind und analysieren Sie den Valgrind-Bericht auf Speicherlecks zu suchen - als Bonus erfahren Sie auch über andere Speicherfehler, wie Doppel-Frees und ungültige Verwendung von freigegebenen Blöcken . – caf

+0

Ich werde das auf jeden Fall zum Testplan hinzufügen. Danke für die Empfehlung – Jay

2

nicht ein OS, um Zuordnungsinformationen zu bekommen. Die C-Bibliothek verwaltet Speicher intern und fragt nur das Betriebssystem nach mehr RAM in Blöcken (4 KB in Ihrem Fall). In den meisten Fällen ist es nie freigegeben, um zum Betriebssystem zurückzukehren, so dass Sie dort wirklich nichts überprüfen können.

Sie müssen malloc() und free() patchen, um die benötigten Informationen zu erhalten.

Oder verwenden Sie Valgrind.

Verwandte Themen