Como posso descobrir o quanto de espaço de endereço do aplicativo está consumindo e relatar isso para o usuário?

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

Pergunta

Eu estou escrevendo o gerenciador de memória para um aplicativo, como parte de uma equipe de programadores vinte e tantos. Estamos a ficar sem quota de memória e precisamos ser capazes de ver o que está acontecendo, uma vez que só parecem estar usando cerca de 700Mb. Eu preciso ser capaz de relatar onde tudo está indo? - fragmentação etc. Todas as ideias

Foi útil?

Solução

Você pode usar ferramentas de memória de depuração existente para isso, eu achei Memória Validador 1 bastante útil, é capaz de controlar tanto a nível API (pilha, novo ...) e nível de sistema operacional (memória virtual) alocações e mostrar mapas de memória virtual.

A outra opção que eu também achei muito útil é o de ser capaz de despejar um mapa de todo o espaço virtual com base na função VirtualQuery. Meu código para isso se parece com isso:

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

Outras dicas

Você também pode encontrar informações sobre os montes em um processo com Heap32ListFirst / Heap32ListNext, e sobre os módulos carregados com Module32First / Module32Next, a partir da API Ajuda Tool.

'Tool Help' originou no Windows 9x. A API informações processo original no Windows NT foi PSAPI, que oferece funções que parcialmente (mas não completamente) sobreposição com ajuda de ferramentas.

O nosso (enorme) de aplicação (um jogo Win32) começaram a jogar exceções "Não o suficiente de cotas" recentemente, e fui acusado de descobrir onde toda a memória estava indo. Não é um trabalho trivial - Esta questão este foram minhas primeiras tentativas de descobrir. comportamento Heap é inesperado, e acompanhar com precisão a quantidade de quota que você usou e quanto está disponível até agora tem provado ser impossível. Na verdade, não é informação particularmente útil de qualquer maneira - "quota" e "um lugar para colocar as coisas" são sutilmente e irritantemente diferentes conceitos. A resposta aceita é tão bom quanto ele ganha, embora enumerando montes e módulos também é útil. Eu costumava DebugDiag de MS para ver o verdadeiro horror da situação, e entender o quão difícil é para rastrear realmente completamente tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top