2011-01-04 7 views
8

Ich brauche einen Speicherprofiler, um die Speicherbelegung für jede Funktion zu kennen. Ich kenne Valgrind (Massif), aber es gibt mir keine Informationen über bestimmte Funktionen (zumindest weiß ich nicht, wie es mit dem Massif tun)Speicherprofiler für C

Kennen Sie ein Werkzeug für diesen Zweck in Linux?

Danke!

+0

Ist für Heap-Speicher. Der Code verwendet eine große Menge an Daten und ich muss wissen, in welcher Funktion er es zuweist. Obwohl die Aufhebung der Zuordnung in anderen Funktionen auftreten kann, wenn die Funktion A 16 GB zuweist und die Maschine 8 GB hat, beginnt der Computer mit dem Austausch (und es spielt keine Rolle, ob die spätere Funktion B die Zuweisung aufheben wird). – lezo

+0

Warum benötigen Sie 16 GB Speicher, der gleichzeitig zugewiesen werden muss? Ich denke, Sie sollten Ihre Anforderungen und Ihr Design überdenken. –

+1

@ Vikram.exe - Sie haben recht, aber um diese Frage zu beantworten, benötigt er die Ergebnisse aus dem Profiler :-) (Denken Sie daran - er kann Code von jemand anderem geschrieben halten, und selbst wenn nicht, Real-Life-Verhalten von Systemen kann oft unvorhersehbar sein :-) – psmears

Antwort

4

Sie können einen Blick auf MemProf werfen.

+0

danke! es ist eine gute Lösung! – lezo

4

Wenn Sie nur den Ort, von dem große Menge an Speicher bekommen angefordert wird, wäre die einfachste Art und Weise malloc Funktion oder erstellen Sie eine neue Bibliothek mit malloc Aufruf patchen und verfolgen die Ihre Größe malloc function bilden. Ich spreche nicht über die Umsetzung der Malloc Call. LD_PRELOAD diese Bibliothek zu Ihrer Anwendung.

hier ist ein Beispielcode:

/* 
* gcc -shared -fPIC foo.c -ldl -Wl,-init,init_lib -o libfoo.so 
* 
* LD_PRELOAD this library in the environment of the target executable 
* 
*/ 

#include <stdio.h> 
#include <sys/time.h> 
#include <dlfcn.h> 
#include <stdlib.h> 
#include <sys/errno.h> 

#ifndef RTLD_NEXT 
#define RTLD_NEXT ((void *)-1) 
#endif 

int init_lib(void) 
{ 
    return 0; 
} 

void *malloc(size_t size) 
{ 
    /* do required checks on size here */ 

    return ((void* (*)(size_t))(dlsym(RTLD_NEXT, "malloc")))(size); 
} 

Sie können diesen Code sehr gut ändern einige zusätzliche Dinge zu tun.

+1

Wer auch immer es gewählt hat, können Sie bitte den Grund angeben? –

+1

Ich bin upboting, weil das alles nicht falsch ist. – jweyrich

+1

Danke Jweyrich, aber ich frage mich immer noch, warum es abgelehnt wurde. –

3

Massiftut zeigen Ihnen, welche Funktionen verantwortlich für die Speichernutzung waren, so lange wie Sie Ihr Programm mit Debug-Informationen kompiliert haben (-g). Es zeigt Ihnen sogar die Zeilennummer.

Diese Information wird als Aufrufbaum in jedem detaillierten Snapshot unter dem Diagramm in der ms_print Ausgabe angegeben. Die Häufigkeit von detaillierten Snapshots kann mit der Option --detailed-freq zu massiv gesteuert werden. Details zum Lesen der detaillierten Snapshot-Informationen finden Sie unter Section 9.2.6 of the Massif manual.

+0

Die Informationen sind nicht zu freundlich (wie in Valgrind üblich), aber es gibt Informationen über die Funktionen. Es gibt ein Tool (Massif Visualizer http://kde-apps.org/content/show.php/Massif+Visualizer?content=122409), das scheint mit bunten Grafiken zu lösen. Ich habe es noch nicht ausprobiert, aber es sieht gut in den Screenshots aus! – lezo

2

Wie andere darauf hingewiesen haben, gibt Massif erschöpfende Profilinformationen, aber es verlangsamt den Prozess erheblich.

Eine andere Option ist Google tcmalloc, die einen eingebetteten Heap-Profiler enthält, der das Aufrufdiagramm mit Zuordnungen ableckt (siehe http://goog-perftools.sourceforge.net/doc/heap_profiler.html), die auch grafisch visualisiert werden können.

Sie können es zur Laufzeit mit Ihrem Programm mit LD_PRELOAD verknüpfen, und die HEAPPROFILE env-Variable aktiviert den Heap-Profiler.