애플리케이션이 사용하는 주소 공간의 양을 확인하고 이를 사용자에게 보고하려면 어떻게 해야 합니까?

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

문제

나는 20여 명의 코더로 구성된 팀의 일원으로 애플리케이션의 메모리 관리자를 작성하고 있습니다.메모리 할당량이 부족하고 약 700Mb만 사용하는 것으로 나타나므로 무슨 일이 일어나고 있는지 확인할 수 있어야 합니다.조각화 등 모든 것이 어디로 진행되고 있는지 보고할 수 있어야 합니다.어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

이를 위해 기존 메모리 디버깅 도구를 사용할 수 있습니다. 저는 Memory Validator를 찾았습니다. 1 매우 유용하며 API 수준(힙, 신규...) 및 OS 수준(가상 메모리) 할당을 모두 추적하고 가상 메모리 맵을 표시할 수 있습니다.

제가 매우 유용하다고 생각하는 또 다른 옵션은 VirtualQuery 기능을 기반으로 전체 가상 공간의 맵을 덤프할 수 있다는 것입니다.이에 대한 내 코드는 다음과 같습니다.

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

다른 팁

도구 도움말 API에서 Heap32ListFirst/Heap32ListNext를 사용하여 프로세스의 힙에 대한 정보와 Module32First/Module32Next를 사용하여 로드된 모듈에 대한 정보를 찾을 수도 있습니다.

'도구 도움말'은 Windows 9x에서 유래되었습니다.Windows NT의 원래 프로세스 정보 API는 도구 도움말과 부분적으로(완전하지는 않지만) 겹치는 기능을 제공하는 PSAPI였습니다.

우리의 (거대한) 응용 프로그램(Win32 게임)은 최근 "할당량이 충분하지 않음" 예외를 발생시키기 시작했으며 모든 메모리가 어디로 가는지 알아내는 임무를 맡았습니다.그것은 사소한 일이 아닙니다. 이 질문과 이 하나 알아보려는 첫 번째 시도였습니다.힙 동작은 예상치 못한 것이며 지금까지 사용한 할당량과 사용 가능한 할당량을 정확하게 추적하는 것은 불가능했습니다.사실, 이는 어쨌든 특별히 유용한 정보는 아닙니다. "할당량"과 "물건을 넣을 곳"은 미묘하고 성가실 정도로 다른 개념입니다.힙과 모듈을 열거하는 것도 편리하지만 허용되는 답변은 최대한 좋습니다.나는 사용했다 디버그 진단 MS에서 상황의 진정한 공포를 확인하고 실제로 모든 것을 철저하게 추적하는 것이 얼마나 어려운지 이해합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top