¿Cómo puedo saber cuánto espacio de direcciones está consumiendo la aplicación e informarlo al usuario?

StackOverflow https://stackoverflow.com/questions/90940

Pregunta

Estoy escribiendo el administrador de memoria para una aplicación, como parte de un equipo de veintitantos codificadores.Nos estamos quedando sin cuota de memoria y necesitamos poder ver qué está pasando, ya que parece que solo estamos usando unos 700 MB.Necesito poder informar hacia dónde va todo: fragmentación, etc.¿Algunas ideas?

¿Fue útil?

Solución

Puede utilizar herramientas de depuración de memoria existentes para esto, encontré Memory Validator 1 bastante útil, es capaz de rastrear asignaciones tanto a nivel de API (montón, nuevo...) como a nivel de sistema operativo (memoria virtual) y mostrar mapas de memoria virtual.

La otra opción que también encontré muy útil es poder volcar un mapa de todo el espacio virtual basado en la función VirtualQuery.Mi código para esto se ve así:

void PrintVMMap()
{
  size_t start = 0;
  // TODO: make portable - not compatible with /3GB, 64b OS or 64b app
  size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
  SYSTEM_INFO si;
  GetSystemInfo(&si);
  size_t pageSize = si.dwPageSize;
  size_t longestFreeApp = 0;

  int index=0;
  for (size_t addr = start; addr<end; )
  {
    MEMORY_BASIC_INFORMATION buffer;
    SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
    if (retSize==sizeof(buffer) && buffer.RegionSize>0)
    {
      // dump information about this region
      printf(.... some buffer information here ....);
      // track longest feee region - usefull fragmentation indicator
      if (buffer.State&MEM_FREE)
      {
        if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
      }
      addr += buffer.RegionSize;
      index+= buffer.RegionSize/pageSize;
    }
    else
    {
      // always proceed
      addr += pageSize;
      index++;
    }
  }
  printf("Longest free VM region: %d",longestFreeApp);
}

Otros consejos

También puede encontrar información sobre los montones en un proceso con Heap32ListFirst/Heap32ListNext y sobre los módulos cargados con Module32First/Module32Next, desde la API de ayuda de la herramienta.

La 'Ayuda de la herramienta' se originó en Windows 9x.La API de información de proceso original en Windows NT era PSAPI, que ofrece funciones que se superponen parcialmente (pero no completamente) con la Ayuda de la herramienta.

Nuestra (enorme) aplicación (un juego Win32) comenzó a generar excepciones de "Cuota insuficiente" recientemente, y me encargaron descubrir dónde estaba yendo toda la memoria.No es un trabajo trivial - esta pregunta y Éste Fueron mis primeros intentos de descubrirlo.El comportamiento del montón es inesperado y hasta ahora ha resultado imposible realizar un seguimiento preciso de cuánta cuota ha utilizado y cuánta está disponible.De hecho, de todos modos no es información particularmente útil: "cuota" y "un lugar donde poner las cosas" son conceptos sutil y molestamente diferentes.La respuesta aceptada es tan buena como parece, aunque enumerar montones y módulos también es útil.solía Diagnóstico de depuración de MS para ver el verdadero horror de la situación y comprender lo difícil que es realizar un seguimiento exhaustivo de todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top