2009-03-31 20 views
37

Estoy escribiendo una aplicación y me sorprende ver que su uso de memoria total ya es demasiado alto. Quiero hacer un perfil del uso de la memoria dinámica de mi aplicación: ¿cuántos objetos de cada tipo hay en el montón y qué funciones crearon? Además, ¿cuánta memoria usa cada objeto?Perfilado de asignación de memoria en C++

¿Hay una manera simple de hacer esto? Estoy trabajando tanto en Linux como en Windows, por lo que las herramientas de cualquiera de las plataformas serían suficientes.

NOTA: No me preocupan las fugas de memoria aquí.

Respuesta

1

En un trabajo anterior utilizamos una herramienta llamada "Purify". Es un producto hecho por Rational/IBM. No creo que esta sea una herramienta gratuita, pero recuerdo que es bastante buena. Aquí hay algo de información:

http://en.wikipedia.org/wiki/IBM_Rational_Purify

+1

Purify le informa sobre corrupciones y fugas de memoria, no el tamaño de los objetos asignados –

3

Hay varias cosas que puede hacer. Lo más simple es vincular una biblioteca de depuración malloc; hay aa número de ellos disponibles, dependiendo de los detalles de su entorno

La segunda opción es que se puede sobrecargar nueva y eliminar en C++ (por ejemplo, Google para _malloc_dbg para Windows.); es posible sobrecargar el nuevo básico y eliminar con nuevas funciones que rastrean la asignación y el uso de la memoria.

9

Para las estadísticas simples, sólo para descubrir dónde se utiliza toda la memoria, se puede añadir una plantilla como esta:

template<class T> 
class Stats { 
    static int instance_count; 
public: 
    Stats() { 
    instance_count++; 
    } 
    ~Stats() { 
    instance_count--; 
    } 
    static void print() { 
    std::cout << instance_count << " instances of " << typeid(T).name() << 
     ", " << sizeof(T) << " bytes each." << std::endl; 
    } 
}; 

template<class T> 
int Stats<T>::instance_count = 0; 

continuación, puede añadir esto como una clase base para las clases que sospechar de tener una gran cantidad de casos, e imprimir las estadísticas del uso de la memoria actual:

class A : Stats<A> { 
}; 

void print_stats() { 
    Stats<A>::print(); 
    Stats<B>::print(); 
    ... 
} 

Esto no le muestra en qué funciones se asignaron los objetos y no da demasiados detalles, pero puede ser que me lo suficiente como para localizar dónde se desperdicia la memoria.

+4

Si lo hace, tenga en cuenta que no es seguro para subprocesos. Puede usar 'std :: atomic' (si tiene C++ 11) o' boost :: atomic' para el incremento/decremento. –

0

Acabo de ver en AQtime site que tienen un buen soporte para "Allocation Profiling".

1

El capítulo 1.10 de Game Programming Gems Volume 2 (Amazon link) detalla un Gestor de memoria de depuración simple pero eficaz de Peter Dalton que proporciona un conjunto de estadísticas decente cuando se descarga el registro.

8

Para Windows, verifique las funciones en "crtdbg.h". crtdbg.h contiene la versión de depuración de las funciones de asignación de memoria. También contiene la función para detectar fugas de memoria, daños, comprobar la validez de los punteros del montón, etc.

Creo que las siguientes funciones te serán útiles.

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

siguiente enlace de MSDN se enumeran las funciones y muestra Montón informes de estado del código http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx

+1

Ese enlace está muerto, tal vez http://msdn.microsoft.com/en-us/library/aa269809(v=vs.60).aspx o http://msdn.microsoft.com/en-us/library/ 974tc9t1.aspx? – TankorSmash

14

¿Ha intentado Valgrind? Es una herramienta de creación de perfiles para Linux. Tiene un corrector de memoria (para pérdidas de memoria y otros problemas de memoria) llamado Memcheck pero también tiene un perfilador de montón llamado Massif.

+0

Incluso hay una integración de Eclipse para Valgrind (http://wiki.eclipse.org/index.php/Linux_Distributions_Project) – lothar

+0

Buen consejo, no conocía ese proyecto. Normalmente uso Cmake con esa herramienta y esto: http://www.vtk.org/Wiki/Eclipse_CDT4_Generator Puedo mover todos mis desarrollos de C++ a Eclipse CDT en Linux, gracias. –

+2

¿Hay alguna manera de registrar el recuento de objetos y la memoria total utilizada por tipo de objeto usando valgrind macizo? – cib

1

El capítulo 4.6 de Game Programming Gems Volume 8 (enlace de vista previa de Safari Book) detalla un perfilador de memoria avanzada de Ricky Lung que puede mostrar la estadística de asignación de forma jerárquica de pila de llamadas y, sin embargo, admite multi-threading.

+0

el capítulo no está inmediatamente visible, ¿tiene el enlace para la vista previa real sin botones de suscripción forzada o pruebas gratuitas? – GameDeveloper

2

Acabo de lanzar un Mem32 de memoria nativo win32, como una versión beta gratuita. http://www.puredevsoftware.com/MemPro.htm. Se engancha en new/delete y envía datos a una aplicación externa donde puede ver las asignaciones de diferentes maneras. Espero que esto sea de ayuda.

0

Prueba el gperftools - se puede:

  • perfil partes específicas del código o todo el programa a la vez.
  • representan datos a través de gráficos visuales que muestran las llamadas a funciones exactas y su herencia.
  • centrarse en regiones específicas de código en un gráfico visual.
  • show diff between dumps.
  • muestra espacio asignado en lugar de utilizado; todo esto se hace con el mismo volcado.

Además, casi no afecta la eficacia del programa.

3

MTuner - un perfilador de memoria C/C++ gratuito. Descripción a continuación:

MTuner es una herramienta de análisis, detección de fugas y detección de fugas multiplataforma compatible con los compiladores MSVC, GCC y Clang. Las características incluyen: historial basado en línea de tiempo de actividad de la memoria, filtrado potente, SDK para instrumentación manual con código fuente completo, soporte de integración continua a través del uso de línea de comandos, detección de fuga de memoria y mucho más. Perfile cualquier plataforma de destino de software con compiladores cruzados GCC o Clang. Viene con soporte integrado para plataformas Windows, PlayStation 4 y PlayStation 3 y una plataforma dirigida por un compilador cruzado basado en Windows.

+0

¿Cómo presento un informe de error? Probé MTuner y se bloquea al ejecutar un ejecutable con una larga línea de comandos.¿Hay un repo github? –

+0

También se bloquea al intentar cargar un archivo '.MTuner' grande (~ 9Gb). ¿Tratas de cargar todo el archivo en la memoria todo a la vez? ¿Verifica si hay errores de asignación de memoria en su código? –

+0

No hay repositorio github, es de fuente cerrada. No dudes en enviarme más información sobre esos bloqueos y los arreglaré/echaré un vistazo. – mtosic

Cuestiones relacionadas