Wie erkennen Sie programmatisch die Anzahl der Bytes, die vom Prozess auf Heap zugewiesen wurden?

8

Wie erkennen Sie programmgesteuert die Anzahl der Bytes, die vom Prozess auf Heap zugewiesen wurden? Dieser Test sollte vom Prozess selbst funktionieren.

    
Pirks 08.11.2009, 14:02
quelle

7 Antworten

2

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.

    
Pavel Shved 08.11.2009, 14:31
quelle
6

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 .

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 -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 () kann das Laden der realen Funktionen abschließen.

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 ...

    
Mr.Ree 08.11.2009 15:20
quelle
6

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     
Martin Del Vecchio 09.11.2009 12:40
quelle
3

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.

    
Charles Salvia 08.11.2009 14:34
quelle
1

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

    
lyricat 08.11.2009 14:37
quelle
1

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.

    
davrieb 08.11.2009 15:48
quelle
0

Andere verfolgen dann alle Ihre Speicherzuweisungen Ich glaube nicht, gibt es eine Möglichkeit, die Größe oder Verwendung des Heap zu berechnen

    
ennuikiller 08.11.2009 14:14
quelle

Tags und Links