2016-11-10 1 views
-1

내 프로세스의 현재 메모리 사용량을 얻기 위해 (WIN32 API를 사용하는) C++ 함수를 구현하고 싶습니다.메모리 사용을 확인하는 방법

이 게시물 How to determine CPU and memory consumption from inside a process?에서 코드를 확인하고 기능을 구현했습니다. 그러나

bool GetMemoryUsage(size_t& usageInBytes) 
{ 
    PROCESS_MEMORY_COUNTERS_EX pmc; 
    if (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, sizeof(pmc))) 
    { 
     usageInBytes = pmc.WorkingSetSize; 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

, 나는 그런 식으로 테스트하려고하면 실패

size_t initialMemoryUsage = 0; 
GetMemoryUsage(initialMemoryUsage); 

size_t use = 596; 
void* memUsed = malloc(use); 

size_t memoryUsage = 0; 
GetMemoryUsage(memoryUsage); 
assert(memoryUsage == initialMemoryUsage + 596); 

free(memUsed); 

GetMemoryUsage(memoryUsage); 
assert(memoryUsage == initialMemoryUsage); 

: GetMemoryUsagepmc.WorkingSetSize를 사용

  • 경우 memoryUsage이 12288에 의해 initialMemoryUsage보다 크고 자유롭게 메모리가 않습니다 감소시키지 마십시오
  • GetMemoryUsagepmc.PrivateUsage, memoryUsageinitialMemoryUsage 내가 패스 위의 검사를 할 수있는 정확하고 신뢰할 수있는 방법으로 일부 메모리
어떻게 구현할 수

GetMemoryUsage을 할당 후에도, 모두 동일?

+1

프로세스에서 메모리를 사용하는 방법에 대한 기대가 잘못되었습니다. 얻은 결과가 정확하고 실제로 무엇이 일어나고 있는지 보여줍니다. –

+0

OK, 메모리가 할당 된 시간과 용량을 알 수있는 방법이 있습니까? 아니면 단순히 불가능한가요? – jpo38

+1

"메모리"와 "할당 된"의 의미에 따라 다릅니다. 현재 메모리가 할당 된 시간과 용량을보고 있습니다. 그것은 당신이 생각하는 기억의 종류가 아닙니다. (Physical? Virtual? Reserved? Resident? 또는 무엇?) 그리고 그것은 당신이 생각하는대로 "할당"되지 않습니다. (예약 되었습니까? 유용한 데이터를 포함하고 있는지, 아니면 무엇을 포함합니까?) 정확히 무엇을 하려는지 알지 못하면 그렇게하는 것이 어렵습니다. 무슨 질문을 하시겠습니까? 가능한 한 구체적으로하십시오. –

답변

0

실제로 런타임시 특정 함수 호출이 메모리 누수를 일으키지 않는지 확인하고 싶습니다. 함수에 의해 할당 된 메모리가 해제되었는지 확인하고 싶습니다. 따라서 어느 시점에서 얼마나 많은 메모리가 새로운/malloc에 ​​의해 할당되었고 아직 릴리즈되지 않았는지 알아야합니다.

죄송합니다. 단지 그런 식으로 작동하지 않습니다.

std::string foo() 
{ 
    return "hello"; 
} 

이 함수가 리턴 전에 존재하지 않았던 새로운 std::string가있을 수 있습니다합니다. 그건 누설이 아니야.

소프트웨어의 작동 방식에 대한 기대치가 있습니다.

저는 프로그래머가 일반적으로 메모리 누수를 디버깅하는 방법을보다 유익하게 보게 될 것이라고 생각합니다. 문제를 해결하는 데 도움을 청할 때 사람들이 자주 범하는 실수는 문제가 해결되어야한다고 생각하는 방식을 생각해 내고 그런 식으로 일하는 데 도움을 청합니다. 그게 당신이하는 일입니다.

대신 실제 문제를 최대한 자세하게 설명하고 전문가에게 해결 방법을 제안 해달라고 요청하십시오. 그들은 일할 수있는 방법을 제안 할 가능성이 더 큽니다.

+0

좋습니다. 여기에 내 문제 설명입니다. VLD를 사용하여 시스템의 중요한 기능에서 메모리 누수를 감지하고 수정했습니다. 이제는 개발자가 앞으로 새로운 누출을 도입하지 않도록 시스템 테스트 스위트에 새로운 유닛 테스트를 추가하여 함수를 호출하고 호출로 힙 사용량이 증가하지 않았는지 확인합니다. 테스트 시스템은 VLD를 통합하지 않으며 릴리스 모드에서 테스트를 실행하므로 Microsoft의 힙 CRT 검사기를 사용할 수 없습니다. 그래서 어떤 시점에서 힙 사용을 검사하는 함수를 갖고 싶습니다. – jpo38

+0

더 많은 가시성을 얻기 위해 별도의 질문을 할 수 있습니다. 그러나 나는 환경에 변화가 없다면 그렇게하기가 쉽지 않다고 생각합니다. 이를 탐지 할 수있는 모든 계측 도구를 사용하지 않도록 선택했습니다. 힙의 릴리스 버전은 비용이 들기 때문에이 정보를 정확하게 보관하지 않습니다. 아마도 누군가가 방법을 알고있을 것입니다. 아마도 릴리스 빌드에 연결할 수있는 계측 된 힙일까요? –

+0

한편 좋은 대답은'malloc (596)'을 수행 한 후에 왜'pmc.WorkingSetSize'가 12288만큼 증가했는지 설명 할 수 있습니다. ;;-) – jpo38

관련 문제