Grundlegende Heapverwendungsstatistiken in GCC auf einer 64-Bit-Plattform

8

Ich muss eine grundlegende Frage in meinem C-Programm beantworten, das von GCC für Linux kompiliert wurde: wieviel Process Heap momentan verwendet wird (allocated by malloc ) und wie viel residiert, wenn Free Heap blockiert. GNU-Implementierung der Standard-Bibliothek hat mallinfo -Funktion, die genau berichtet, was ich brauche, aber es nur mit 32-Bit-Konfigurationen nutzbar und, AFAIK, gibt es kein 64-Bit-Äquivalent dieser Funktionalität (BTW, weiß jemand warum?).

Ich benutze GCC unter Linux, also brauche ich das für Linux. Aber ich gehe davon aus, dass der Heap für das System undurchsichtig ist. Die einzige Möglichkeit, diese Frage zu beantworten, besteht darin, die von der Implementierung der Standardbibliothek bereitgestellten Mittel zu verwenden.

In MSVC-Implementierung auf Windows-Plattform gibt es keine Entsprechung von mallinfo -Funktion, aber es gibt so genannte Heap-Walk -Funktionalität, die es ermöglicht, die erforderlichen Informationen durch Iterieren durch alle Blöcke im Heap zu berechnen. AFAIK, in der GNU C-Bibliothek gibt es kein Heap-Walk-Interface. (Gibt es?).

Also, nochmal, was mache ich in GCC? Es muss nicht effizient sein, was bedeutet, dass der oben erwähnte Heap-Walk-basierte Ansatz für mich perfekt funktionieren würde. Wie finde ich heraus, wie viel Heap im GCC verwendet wird und wie viel frei ist? Ich kann wahrscheinlich versuchen, malloc-Hooks zu installieren und "manuell" die Größen zu verfolgen, obwohl ich nicht sicher bin, wie man die aktuelle Größe der Heap-Arena bestimmt (siehe mallinfo.arena ), ohne mallinfo zu benutzen.

    
AnT 09.05.2010, 16:58
quelle

1 Antwort

3

Dieser Thread von 2004 mit wichtigen glibc-Entwicklern zeigt an, dass die Schnittstelle bereits < em> "... passt überhaupt nicht zur Implementierung." , es wurde als wenig sinnvoll angesehen, eine 64-Bit-Version davon sauber zu machen. (Die mallinfo() -Schnittstelle wurde nicht für glibc entwickelt - sie wurde für die Aufnahme in die SUS berücksichtigt.

Je nachdem, was Sie mit den Informationen versuchen, können Sie möglicherweise malloc_stats() verwenden, was nur bei Standardfehlern ausgegeben wird - da es sich nur um Textausgabe handelt, kann es geändert werden, um der internen Implementierung von% zu entsprechen. co_de% und wird daher zumindest den Vorteil haben, sinnvolle Ergebnisse zu erzielen.

    
caf 10.05.2010 07:34
quelle