2011-01-04 15 views
8

Necesito un generador de perfiles de memoria para conocer el uso de memoria para cada función. Sé valgrind (Macizo) pero no me da información sobre funciones específicas (al menos, no sé cómo hacerlo con macizo)Profiler de memoria para C

¿Conoces alguna herramienta para este propósito en Linux?

Gracias!

+0

Es para la memoria del montón. El código usa una gran cantidad de datos y necesito saber en qué función se está asignando. Aunque la desasignación puede ocurrir en otra función, si la función A asigna 16Gb y la máquina tiene 8Gb, la computadora comienza a intercambiar (y no importa si la función B posterior lo va a desasignar). – lezo

+0

¿Por qué necesita asignar 16 G de memoria a la vez? Creo que deberías reconsiderar tu requerimiento y diseño. –

+1

@ Vikram.exe - tiene razón, pero para responder a esa pregunta, necesita los resultados del generador de perfiles :-) (Recuerde: puede que esté manteniendo el código escrito por otra persona, e incluso si no, el comportamiento de la vida real) de los sistemas a menudo puede ser impredecible :-) – psmears

Respuesta

4

Es posible que desee echar un vistazo a MemProf.

+0

gracias! ¡es una buena solución! – lezo

4

Si lo que desea es obtener la ubicación desde la que se solicita la gran cantidad de memoria, la manera más fácil sería para parchear malloc función o crear una nueva biblioteca que tiene malloc llamada y realizar un seguimiento del tamaño de formar su malloc function. No estoy hablando de implementar la llamada malloc. LD_PRELOAD esta biblioteca a su aplicación.

aquí es un ejemplo de código:

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

Puede muy bien modificar este código para hacer algunas cosas adicionales.

+1

Quien abajo lo votó, ¿podría dar la razón? –

+1

Estoy votando porque esto está lejos de ser incorrecto. – jweyrich

+1

Gracias Jweyrich, pero todavía me pregunto por qué fue votado. –

3

Massif hace que las funciones que eran responsables de la utilización de la memoria muestran, siempre y cuando se haya compilado su programa con información de depuración (-g). Incluso le mostrará el número de línea.

Esta información se proporciona como un árbol de llamadas en cada instantánea detallada en el gráfico en la salida ms_print. La frecuencia de las instantáneas detalladas se puede controlar con la opción --detailed-freq de macizo. Consulte Section 9.2.6 of the Massif manual para obtener detalles sobre la lectura de la información de instantánea detallada.

+0

La información no es muy amigable (como es habitual en valgrind) pero es cierto que proporciona información sobre las funciones. Hay una herramienta (visualizador macizo http://kde-apps.org/content/show.php/Massif+Visualizer?content=122409) que parece resolver esto con coloridos gráficos. No lo he probado todavía, pero se ve genial en las capturas de pantalla. – lezo

2

Como otros han señalado, Massif ofrece una exhaustiva información de creación de perfiles, pero ralentiza considerablemente el proceso.

Otra opción es Google tcmalloc, que tiene un generador de perfiles incrustado que vacia el gráfico de llamadas con asignaciones (ver http://goog-perftools.sourceforge.net/doc/heap_profiler.html), que también se puede visualizar gráficamente.

Puede vincularlo en tiempo de ejecución con su programa con LD_PRELOAD, y la variable de env HEAPPROFILE habilita el generador de perfiles de montón.