VC++환경에서 메모리릭을 찾기 위한 방법은 디버그 모드에서 CRT(C runtime library)디버그 함수를 사용


1. 밑에 선언하는 방법


- _CrtDumpMemoryLeaks()함수로 메모리릭 찾기

  #define CRTDBG_MAP_ALLOC

  #include <stdlib.h>

  #include <crtdbg.h>

  //위의 순서를 반드시 지켜야 함


  void memleak()
  {
      // 메모리가 누수가 일어나는 부분

  }                                                    


  void main()
  {
   memleak();

  _CrtDumpMemoryLeaks();
  }

_CrtDumpMemoryLeaks() 함수를 사용하여 메모리릭을 찾는 방법을 사용시는 반드시 메모리릭이 발생된 이후 시점에서 이 함수를 호출해야만 누수된 메모리 블록 정보를 확인할 수 있다.


2. 위에 선언하는 방법

- _CrtSetDbgFlag()함수로 메모리릭 찾기==> 프로그램 시작부분에 함수 호출

  _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 호출


#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h>

void memleak()
{
  ... // (메모리 누수가 일어나는 부분)

}

void main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
memleak();
}


[옵션들]

_CRTDBG_ALLOC_MEM_DF - 메모리 할당이 일어나는 경우 추적하게 해줍니다.

_CRTDBG_LEAK_CHECK_DF - 종료시에 _CrtDumpMemoryLeaks()를 호출하여 메모리 누수 정보를 표시해 줍니다.

_CRTDBG_DELAY_FREE_MEM_DF - 실행중간에 메모리가 해제 된다고 하더라도 실제로 해제를 실행하지 않고 종료 시 해제를 하게 합니다.

_CRTDBG_CHECK_ALWAYS_DF - 모든 할당 및 할당 취소에서 _CrtcheckMemory를 호출하여 실행속도는 지연되지만 오류를 신속하게 찾아냅니다.

_CRTDBG_CHECK_CRT_DF - CRT내부도 메모리 탐지에 포함 시킵니다.


3. New메모리에 CRT기능 넣기

위에 1,2번 기준으로 디버깅을 돌려보면은 메모리 누수 정보는 나오지만 new 메모리 할당시에는

정확한 정보가 나오지 않는다

아래와 같이 고치면 정확한 정보가 뜰 것이다.


#include <stdio.h>
#include <string.h>
#include <crtdbg.h>

//디버그용  new
#ifdef _DEBUG
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif

int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);


...


return 0;
}


[참고]

기본적으로 MFC에서는 위 코드를 활용할 필요가 없다.

왜냐면 메모리 누수 관련 코드가 만들자마자 자동 삽입되기때문이다.


출처 : 네이버 게임 프로그래밍 카페

Posted by Gungume
,

1. 모든 소스의 선두에 아래 순서대로 입력한다.

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)


- 순서가 다르면 안됨

- stdafx.h(미리 컴파일된 해더)에 넣어도 된다.



2. Main()함수 - 맨 처음 시작하는 함수

첫번째 라인에 아래와 같이 적는다.

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);



3. VS에서 디버그 모드로 시작(F5)하고, 스스로 종료해야 한다.

(Shift + F5를 하지 말라는 의미임)



4. 기타

- 직접 테스트 해 본 결과로는 Malloc도 가능하다.

 (#define new 없으면 new만 된다..-_-a 잘 이해 안됨)

- CRT로는 전체 CallStack을 찍어주지 않고

  최종적으로 new를 사용한 곳을 찝어주는 것 같다.

  만약 이미 소스에서 new를 다르게 만들어 사용한다면 역시나 찾을 수 없게 될 듯.




[예제]

#include "stdafx.h" //여기엔 이 두가지만 있다.

//#include <iostream>
//#include <tchar.h>

//만약 아래의 내용을 iostream보다 먼저 쓰는 경우 Error가 난다.


#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)


int _tmain(int argc, _TCHAR* argv[])
{
       _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
       char* pNew = NULL;
       pNew = new char;


       char* pMalloc = NULL;
       pMalloc = (char*)malloc( sizeof(char) * 10 );


       char* pAA = NULL;
       pAA = new char[100];
       delete [] pAA;


       return 0;
}


[잘 된 결과]

- 아래처럼 실제로 사용한 파일명과 할당한 라인 수가 나와야 제대로 된 것

Detected memory leaks!
Dumping objects ->
d:\study myself\디버깅\crtmemoryleak\crtmemoryleak.cpp(30) : {44} normal block at 0x00372D80, 10 bytes long.
Data: <          > CD CD CD CD CD CD CD CD CD CD
d:\study myself\디버깅\crtmemoryleak\crtmemoryleak.cpp(24) : {43} normal block at 0x00372D40, 1 bytes long.
Data: < > CD
Object dump complete.
'[840] CRTMemoryLeak.exe: 네이티브' 프로그램이 0 (0x0) 코드에서 끝났습니다.


[잘못된 결과]

- 순서가 잘못되거나 하면 crtdbg.h파일의 라인수가 나온다.

Detected memory leaks!
Dumping objects ->
c:\program files\microsoft visual studio .net 2003\vc7\include\crtdbg.h(689) : {43} normal block at 0x00372D40, 1 bytes long.
Data: < > CD
Object dump complete.


출처 : 네이버 블로그였는데 까먹음;;;

Posted by Gungume
,