Eine spekulative Lösung: Definieren Sie die Operatoren new
und delete
neu.
Bei jedem new
-Operator-Aufruf wird eine Anzahl zuzuteilender Bytes übergeben. Weisen Sie ein wenig mehr Speicher zu und speichern Sie die Menge der Bytes, die Sie zugewiesen haben. Fügen Sie diesen Betrag der globalen Variablen hinzu, die die Größe des Heapspeichers enthält.
Bei delete
Operator-Aufruf, überprüfen Sie den Wert, den Sie gespeichert haben, bevor Sie den Speicher entsorgen. Subtrahiere es von dieser globalen Variable.
Es gibt eine Reihe von Möglichkeiten.
Wie genau soll es sein? Sie können einige nützliche Daten über cat / proc / $ {PID} / status | grep VmData strong>.
Sie können #define Ihre eigenen malloc () , realloc () , calloc () und free () Funktionen, die die echten Funktionen hinter Ihrem eigenen Counter verstecken. Du kannst hier wirklich coole Sachen machen mit __FILE__, __LINE__, & amp; __func__ erleichtert die Identifizierung von Kernlecks in einfachen Tests. Aber es wird nur Ihren eigenen Code instrumentieren!
(Sie können auch die Standardmethoden operator new und operator delete , sowohl Array- als auch Nicht-Array-Varianten und beide, die std :: bad_alloc und std enthalten, neu definieren :: nothrow_t Varianten. Auch hier wird nur dein eigener Code instrumentiert!)
(Beachten Sie: Auf den meisten C ++ - Systemen ruft new letztendlich malloc () auf. Das muss nicht sein. Insbesondere bei in-place new ! Aber neu verwendet normalerweise malloc () . (Oder es funktioniert in einem Speicherbereich, der zuvor malloc () 'ed war) .) Sonst würden Sie mit mehreren Heap-Managern wirklich funky Sachen bekommen ...)
Sie können sbrk (0) verwenden, um zu sehen, wo das Datensegment derzeit festgelegt ist. Das ist nicht so toll. Es ist eine sehr grobe Messung, und es berücksichtigt keine Lücken (ungenutzte Speicherbereiche) im Heap. (Sie sind viel besser dran mit der VmData strong> -Zeile von / proc / $ {PID} / status .) Aber wenn Sie nur nach einer allgemeinen Idee suchen .. .
Sie können malloc () / free () / etc abfangen, indem Sie Ihre eigene gemeinsam genutzte Bibliothek schreiben und Ihren Prozess zwingen, sie anstelle der realen Versionen über LD_PRELOAD zu verwenden. Sie können dlopen () / dlsym () verwenden, um & amp; Rufen Sie das * real * malloc () / free () / etc auf. Das funktioniert ganz schön. Der ursprüngliche Code ist unverändert, nicht einmal neu kompiliert. Seien Sie sich jedoch bei der Codierung dieser Bibliothek auf wiederkehrende Situationen bewusst und dass Ihr Prozess anfänglich malloc () / calloc () / realloc () vor dlopen () / dlsym ()
Sie könnten Tools wie Valgrind ausprobieren, obwohl das mehr auf Speicherlecks abzielt.
Vielleicht möchten Sie auch mtrace () ? Oder __ malloc_hook ? Sehr proprietär (GNU) & amp; Nicht-Standard ... Aber Sie sind mit "Linux" getaggt ...
Ich denke, mallinfo () ist was du willst:
%Vor%Die Struktur "mallinfo" ist technisch und spezifisch für die Implementierung von malloc (). Aber die Information, die du willst, ist da drin. So berichte ich die Werte:
%Vor%Diese beiden werden angeblich nicht benutzt, aber sie scheinen sich auf meinem System zu ändern und könnten daher gültig sein:
%Vor%Und der andere interessante Wert wird von "sbrk (0)"
zurückgegeben Es gibt keine einfache automatische Möglichkeit, dies zu tun, wenn Sie das fragen. Sie müssen die Heap-Allokationen manuell manuell mit einer Counter-Variablen verfolgen. Das Problem ist, dass es schwierig ist, zu steuern, welche Teile Ihres Programms Speicher auf dem Heap zuweisen, besonders wenn Sie viele Bibliotheken außerhalb Ihrer Kontrolle verwenden. Um die Dinge noch weiter zu verkomplizieren, gibt es zwei Möglichkeiten, wie ein Programm den Heapspeicher zuweisen kann: new
oder malloc
. (Ganz zu schweigen von direkten Betriebssystemaufrufen wie sbrk
.)
Sie können den globalen Operator new
außer Kraft setzen und jeden Anruf entgegennehmen neu zu erhöhen eine globale Tally. Dies schließt jedoch nicht notwendigerweise Zeiten ein, wenn Ihr Programm malloc
aufruft oder wenn Ihr Programm eine klassenspezifische new
override verwendet. Sie können malloc
auch mit einem Makro überschreiben, aber das ist nicht unbedingt übertragbar. Und Sie müssten auch alle Variationen von malloc
, wie realloc
, calloc
usw. überschreiben. All dies wird durch die Tatsache noch komplizierter, dass new
selbst bei einigen Implementierungen malloc
aufrufen kann. .
Im Wesentlichen ist es sehr schwierig, dies in Ihrem Programm richtig zu machen. Ich würde stattdessen ein Speicherprofil-Tool empfehlen.
Wenn Sie Windows verwenden, können Sie mit GetProcessHeap()
, HeapQueryInfo()
Informationen zum Heap der Prozesse abrufen. Ein Beispiel für das Abrufen des Heapspeichers von MSDN
Da Sie Ihre Frage 'linux' markiert haben, könnte es hilfreich sein, einige der Informationen im Verzeichnis /proc
zu betrachten. Ich habe das nicht viel erforscht, also kann ich dir nur einen Ausgangspunkt geben.
/proc/<your programs pid>
enthält Dateien mit einigen Informationen über Ihren Prozess aus der Sicht des Kernels. Es gibt einen Symlink /proc/self
, der immer über den Prozess, von dem Sie das untersuchen, ist.
Die Dateien, an denen Sie am meisten interessiert sind, sind stat
, statm
und status
. Letzteres ist menschlicher lesbar, während die beiden ersteren die gleichen Informationen in einem maschinenlesbaren Format geben.
Auf der Hilfeseite proc(5)
ist ein Startpunkt zur Interpretation des Inhalts dieser Dateien verfügbar.
Andere verfolgen dann alle Ihre Speicherzuweisungen Ich glaube nicht, gibt es eine Möglichkeit, die Größe oder Verwendung des Heap zu berechnen