versiones guia espaƱol descargar actualizar c++ memory-management visualization

c++ - guia - qgis manual



rastrear asignaciones de memoria C++ (8)

"Una representación gráfica del montón a lo largo del tiempo": cerca de lo que está buscando se implementa en Intel (R) Evento único API , los detalles se pueden encontrar en este artículo (es bastante grande para ponerlo aquí).

Muestra la línea de tiempo de las asignaciones por tamaño de bloque y permite agregar marcas adicionales a su código para comprender mejor la imagen completa.

Estoy buscando una manera de rastrear las asignaciones de memoria en un programa C ++. No estoy interesado en las pérdidas de memoria, que parecen ser lo que la mayoría de las herramientas están tratando de encontrar, sino en crear un perfil de uso de memoria para la aplicación. La salida ideal sería una gran lista de nombres de función más el número máximo de bytes asignados a lo largo del tiempo o mejor aún, una representación gráfica del montón a lo largo del tiempo. El eje horizontal es el tiempo, el espacio del montón del eje vertical. Cada función obtendría su propio color y dibujaría líneas de acuerdo con los bytes de montón asignados. Puntos de bonificación para identificar los tipos de objetos asignados también.

La idea es encontrar los cuellos de botella de la memoria / para visualizar qué funciones / hilos consumen la mayor cantidad de memoria y deben estar destinados a una mayor optimización.

Miré brevemente a Purify, BoundsChecker y AQ Time, pero no parecen ser lo que busco. Valgrind parece adecuado, sin embargo, estoy en Windows. Memtrack parece prometedor, pero requiere cambios significativos en el código fuente.

Mis habilidades de Google deben haberme fallado, porque no parece ser una solicitud tan poco común. Toda la información necesaria para crear una herramienta como esta debería estar disponible desde los símbolos de depuración del programa más las llamadas API en tiempo de ejecución, ¿no?


En Mac OS X, puede utilizar la herramienta de creación de perfiles de código Shark para hacer esto, IIRC.


En Xcode, puede usar instrumentos para rastrear asignaciones, uso de VM y muchos otros parámetros. Muy popular entre los desarrolladores de iOS, pero vale la pena intentarlo.



Para un rastreador de memoria C ++ genérico, deberá sobrecargar lo siguiente:

global operator new global operator new [] global operator delete global operator delete [] any class allocators any in-place allocators

El truco es obtener información útil, los operadores sobrecargados solo tienen información de tamaño para asignadores y punteros de memoria para eliminar. Una respuesta es usar macros. Lo sé. Asqueroso. Un ejemplo: colocar en un encabezado que se incluye de todos los archivos fuente:

#undef new void *operator new (size_t size, char *file, int line, char *function); // other operators #define new new (__FILE__, __LINE__, __FUNCTION__)

y crea un archivo fuente con:

void *operator new (size_t size, char *file, int line, char *function) { // add tracking code here... return malloc (size); }

Lo anterior solo funciona si no tiene ningún operador nuevo definido en el alcance de la clase. Si tienes algo en el alcance de la clase, hazlo:

#define NEW new (__FILE__, __LINE__, __FUNCTION__)

y reemplaza ''nuevo tipo'' con ''NUEVO tipo'', pero eso requiere cambiar mucho código potencialmente.

Como es una macro, eliminar el rastreador de memoria es bastante sencillo, el encabezado se convierte en:

#if defined ENABLED_MEMORY_TRACKER #undef new void *operator new (size_t size, char *file, int line, char *function); // other operators #define NEW new (__FILE__, __LINE__, __FUNCTION__) #else #define NEW new #endif

y el archivo de implementación:

#if defined ENABLED_MEMORY_TRACKER void *operator new (size_t size, char *file, int line, char *function) { // add tracking code here... return malloc (size); } endif



Usa Valgrind y su herramienta Massif. Su salida de ejemplo (una parte de ella):

99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. ->49.74% (10,000B) 0x804841A: main (example.c:20) | ->39.79% (8,000B) 0x80483C2: g (example.c:5) | ->19.90% (4,000B) 0x80483E2: f (example.c:11) | | ->19.90% (4,000B) 0x8048431: main (example.c:23) | | | ->19.90% (4,000B) 0x8048436: main (example.c:25) | ->09.95% (2,000B) 0x80483DA: f (example.c:10) ->09.95% (2,000B) 0x8048431: main (example.c:23)

Por lo tanto, obtendrá información detallada:

  • QUIÉN asignó la memoria (funciones: g (), f (), y main () en el ejemplo anterior); también obtiene traza inversa completa que conduce a la función de asignación,
  • a QUÉ estructura de datos fue la memoria (no hay estructuras de datos en el ejemplo anterior),
  • Cuando paso,
  • qué PORCENTAJE de toda la memoria asignada es (g: 39.7%, f: 9.95%, principal: 49.7%).

Aquí está el manual de Massif

Puede hacer un seguimiento de la asignación del montón y la asignación de la pila (desactivada de forma predeterminada).

PD. Acabo de leer que estás en Windows. Sin embargo, dejaré la respuesta porque da una idea de lo que puedes obtener de una posible herramienta.


Monitorear el uso de la memoria de su PC para el desarrollo del juego contiene un ejemplo casi perfecto de lo que estaba buscando. Me tomó un tiempo ejecutarlo, pero el autor del artículo fue muy útil. Puede encontrar el código fuente de la herramienta aquí Memtracer .

También obtuve muchas respuestas útiles en SWENG (lista de correo de ingeniería de software). El hilo se llama "[Sweng-Gamedev] monitoreando el uso de la memoria C ++?".