Come posso scoprire quanto di spazio di indirizzi l'applicazione di consumo e di segnalare questo utente?

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

Domanda

Sto scrivendo il gestore della memoria per un'applicazione, come parte di un team di venti programmatori.Stiamo per esaurire quote di memoria e di cui abbiamo bisogno per essere in grado di vedere cosa sta succedendo, dal momento che solo sembrano essere utilizzando circa 700Mb.Ho bisogno di essere in grado di report in cui tutto è andato - frammentazione etc.Tutte le idee?

È stato utile?

Soluzione

È possibile utilizzare la memoria esistenti strumenti di debug per questo, ho trovato Memoria Validator 1 molto utile, è in grado di monitorare sia il livello delle API (heap, di nuovo...) e a livello di sistema operativo (Memoria Virtuale) assegnazioni e mostra la memoria virtuale mappe.

L'altra opzione che ho trovato molto utile è quello di essere in grado di scaricare una mappa dell'intero spazio virtuale basato su VirtualQuery funzione.Il mio codice per questo simile a questo:

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

Altri suggerimenti

È inoltre possibile trovare informazioni su cumuli in un processo con Heap32ListFirst/Heap32ListNext, e su moduli caricati con Module32First/Module32Next, da Strumento di Aiuto API.

'Strumento di Aiuto" è nato su Windows 9x.Il processo originale informazioni API di Windows NT è stato PSAPI, che offre funzioni che in parte (ma non completamente) sovrapposizione con Strumento di Aiuto.

Il nostro (grande) applicazione (Win32 gioco) ha iniziato a lanciare "Non abbastanza" quota di eccezioni di recente, e mi è stato addebitato con la scoperta di cui tutta la memoria stava andando.Non è un lavoro banale - a questa domanda e questo sono stati i miei primi tentativi di trovare out.Heap comportamento imprevisto, e di effettuare un monitoraggio accurato di quanto quota che hai utilizzato e quanto è disponibile finora ha dimostrato impossibile.Infatti, non è particolarmente utile informazione in ogni caso - la "quota" e "da qualche parte a mettere le cose" sono sottilmente e fastidiosamente concetti diversi.Accettato di risposta è buono come si arriva, anche se l'enumerazione di cumuli e moduli, è a portata di mano.Ho usato DebugDiag da MS per vedere il vero orrore della situazione, e capire quanto sia difficile in realtà accuratamente tenere traccia di tutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top