2017-03-18 10 views
1

내 응용 프로그램 내에 기본 메모리 프로파일 러를 구현하려고합니다 (예, 강력한 외부 소프트웨어의 존재를 알고 있습니다). 할당 훅을 사용하는 방법에 대한 몇 가지 온라인 예제를 연구 해왔고 메모리 할당을 계산할 부분을 얻었다. 메모리가 할당 될 때이 카운터를있는 물건의 크기를 검색 int 변수를 증가하기 쉬운 반면, 그러나Allocator 후크를 사용할 때 해제되는 바이트를 검색하는 방법은 무엇입니까?

int64_t memUsage (0); 
int __cdecl MyAllocHook(
    int  nAllocType, 
    void * pvData, 
    size_t nSize, 
    int  nBlockUse, 
    long  lRequest, 
    const unsigned char * szFileName, 
    int  nLine 
) 
{ 
    if (nAllocType ==_HOOK_ALLOC) 
    { 
     memUsage += nSize; 
    } 
    else if (nAllocType == _HOOK_FREE) 
    { 
    //HOW-TO: memUsage -= nSize; ??? 
    } 

    return(TRUE); 
} 

: 그것은 즉, 더 많거나 적은 다음과 같습니다 단지 CtrSetAllocHook와 함께 사용자 정의의 malloc을 설치하는 방법에 대한 것입니다 nSize에서 할당 된 메모리를 해제 할 때 어떻게 카운터를 줄여야하는지 알 수 없습니다. 이유는 메모리를 확보하기 위해 malloc을 호출하면 (즉, nAllocType 매개 변수 = _HOOK_FREE_), 위의 함수의 매개 변수 nSize은 항상 0과 같습니다. 즉, malloc 훅 안에서 해제 된 바이트 수를 저장할 수 없다는 의미입니다.

이 자유 메모리 모드로 호출 될 때 누군가가 할당 후크를 사용하여 memUsage 카운터를 줄일 수있는 방법을 이해할 수 있습니까?

+0

힙 관리 저장소 정보를 알고 계십니까? 실제 데이터 옆에있는 힙 블록 크기. 'pvData'를 감소시킬 때 (주소 크기에 의해) 블록의 크기를 자유롭게 찾을 수 있습니다. Google [MSVC heap management] (예 : [CRT Debug Heap Details]) (https://msdn.microsoft.com/en-us/library/974tc9t1.aspx)가 도움이 될 수 있습니다. – Scheff

+0

태그가 조금 있습니다. 조금 오도. C++에는 할당 자에 대한 개념이있어 문제와는 아무런 관련이 없습니다. ([** C++ **] (http://stackoverflow.com/questions/tagged/c%2b%2b) 의심 스럽습니다.)'_CrtSetAllocHook'는 MS CRT와 관련이있는 것 같습니다. 사실, C++ 표준은 새롭고 삭제 된 것이 내부적으로 사용해야하는 것을 언급하지 않습니다. Microsoft C++의 경우, 아마도'malloc()'및'free()'구현에서 사용되는 것일 것입니다. – Scheff

+0

@Scheff 귀하의 의견에 감사드립니다. 그러나, 나는 그것이 당신이 말하는 것에 많은 불분명 한 점들이 있다는 것을 두려워합니다. 우선, void 포인터에 대해 산술 연산이 불법이므로'pvData'를 감소시키는 것은 무엇을 의미합니까? 둘째, 당신이 제안한 문서를 읽고 나서, 나는'pvData'를 사용하여 mem 크기를 되 찾는 방법을 모르겠습니다. 직관적으로 나는 (size_t *) (pvData)'또는'((size_t *) ptr) -1)'이 줄 수 있다고 생각했지만, 그렇지 않았다. – Louis15

답변

1

Visual Studio 6.0 및 2008의 디버그 모드에서 (어떤 버전을 사용하고 있습니까?) pvData가 가리키는 데이터 앞에는 메모리에 대한 정보가 들어있는 _CrtMemBlockHeader 구조체가옵니다.

헤더의 시작 부분으로 이동하여 헤더 구조체에서 슬롯 nDataSize를 가져 오기 위해 pvData를 감소시킵니다. 또한

int MyAllocHook(..) 
{ 
    else if (nAllocType == _HOOK_FREE) 
    { 
     size_t headerSize = sizeof(_CrtMemBlockHeader); 
     _CrtMemBlockHeader* pHead; 
     size_t ptr = (size_t) pvData - headerSize; 
     pHeader = (_CrtMemBlockHeader*) (ptr); 
     size_t dataSize = pHeader->nDataSize; 
} 

은 (비주얼 스튜디오 2008) 여기에 두 번째 대답을 참조하십시오

What useful things can I do with Visual C++ Debug CRT allocation hooks except finding reproduceable memory leaks?

+0

감사합니다. 트릭을 수행했을뿐만 아니라 mem 블록의 처리 방법을 이해하는 데 도움이됩니다. – Louis15

0

가 더 유연한 솔루션을 가리키는 때문에 더 나은 내 질문에 @Angela 리처드슨의 답변을 좋아하지만 그 Visual Studio에서 _CrtMemBlockHeader을 사용하여 Visual Studio에서도 사용할 수있는 간단한 솔루션을 제공한다는 점도 여기에 가치가 있다고 생각합니다. _msize(void* ptr)