2011-01-04 7 views
8

Ho bisogno di un profiler di memoria per conoscere l'utilizzo della memoria per ogni funzione. Conosco valgrind (Massif) ma non mi dà informazioni su funzioni specifiche (almeno, non so come farlo con il massif)Profilo di memoria per C

Conoscete qualche strumento per questo scopo in Linux?

Grazie!

+0

È per memoria heap. Il codice utilizza una grande quantità di dati e ho bisogno di sapere in quale funzione lo sta allocando. Sebbene la deallocazione possa avvenire in un'altra funzione, se la funzione A alloca 16 Gb e la macchina ha 8 Gb il computer inizia lo scambio (e non importa se la funzione successiva B la dealligherà). – lezo

+0

Perché è necessario assegnare 16 G di memoria contemporaneamente? Penso che dovresti riconsiderare le tue esigenze e il tuo design. –

+1

@ Vikram.exe - hai ragione, ma per rispondere a questa domanda ha bisogno dei risultati del profiler :-) (Ricorda che potrebbe mantenere il codice scritto da qualcun altro, e anche se non lo è, comportamento nella vita reale di sistemi può spesso essere imprevedibile :-) – psmears

risposta

4

Si consiglia di dare un'occhiata a MemProf.

+0

grazie! è una buona soluzione! – lezo

4

Se si desidera solo per ottenere la posizione da cui è richiesta grande quantità di memoria, Il modo più semplice sarebbe quella di rattoppare malloc funzione o creare una nuova libreria con malloc chiamata e monitorare la dimensione a formare la vostra malloc function. Non sto parlando di implementare la chiamata malloc. LD_PRELOAD questa libreria per la tua applicazione.

ecco un esempio di codice:

/* 
* 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); 
} 

Si può benissimo modificare questo codice per fare alcune cose aggiuntive.

+1

Chiunque verso il basso Ha votato, potresti fornire la motivazione? –

+1

Sto inventrando perché questo è lungi dall'essere sbagliato. – jweyrich

+1

Grazie Jweyrich, ma mi chiedo ancora perché sia ​​stato votato. –

3

Massiffa quali funzioni sono stati responsabili per l'utilizzo della memoria mostrano, a patto che avete compilato il programma con informazioni (-g) di debug. Ti mostrerà anche il numero della linea.

Questa informazione viene fornita come un albero di chiamata in ciascuna istantanea dettagliata sotto il grafico nell'output ms_print. La frequenza delle istantanee dettagliate può essere controllata con l'opzione --detailed-freq su Massif. Vedere Section 9.2.6 of the Massif manual per i dettagli sulla lettura delle informazioni dettagliate dell'istantanea.

+0

L'informazione non è troppo amichevole (come al solito in valgrind) ma è vero che fornisce informazioni sulle funzioni. C'è uno strumento (massif visualizer http://kde-apps.org/content/show.php/Massif+Visualizer?content=122409) che sembra risolvere questo problema con una grafica colorata. Non l'ho ancora provato ma sembra fantastico negli screenshot! – lezo

2

Come altri hanno sottolineato, Massif fornisce informazioni di profilazione esaustive, ma rallenta notevolmente il processo.

Un'altra opzione è tcmalloc di Google, che ha un heap profiler incorporato che scarica il grafo delle chiamate con allocazioni (vedere http://goog-perftools.sourceforge.net/doc/heap_profiler.html), che può anche essere visualizzato graficamente.

È possibile collegarlo in runtime al programma con LD_PRELOAD e la variabile env HEAPPROFILE consente il profiler dell'heap.