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.
Microsoft ha documentado funciones de seguimiento de memoria. Sin embargo, por alguna razón, no son muy conocidos en la comunidad de desarrolladores. Estas son funciones de depuración CRT. Un buen punto de partida serán las funciones de CRT Debug Heap .
Vea los siguientes enlaces para más detalles
- Funciones de informes de estado de pila
- Seguimiento de solicitudes de asignación de pila . Probablemente esta es la funcionalidad que está buscando.
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
Pruebe también este: Memory Validator
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 ++?".