본문 바로가기

Programming/MFC

메모리 릭 찾기

출처 카페 > 와이 가리비 노리터 | 가리비
원문 http://cafe.naver.com/ygaribi/60


메모리
릭을제거하자#1


 

 

프로그램을개발하면서많은어려움중에하나가메모리릭을찾는문제라생각이됩니다.

특히필자는메모리조차해결안하고,필드로출시했던경험들도있는데요..

물론사용에문제는없었습니다...하지만,,,정말루정말루이제는이러면안된다고생각합니다..철든거같습니다⌒⌒

컬럼에서는Microsoft Visual Studio .NET에서제공하는강력한찾는디버깅몃가지를설명합니다.

 

먼저예제작성을하겠습니다.

비주얼스트디오2003실행시킨후에새프로젝트를클릭해주세요.

 

Win32콘솔프로젝트를선택후확인버튼을클릭합니다.

 

사용자 삽입 이미지

 

 

 

 

기본소스에서메모리릭을표시하기위하여,가지작업이필요합니다.

MFC사용이나MFC프로젝트이용시에는아래설정이필요하지않습니다.

아래설정은출력창에메모리릭이발생했을경우표시하여주는기능을합니다.

 

아래헤더와Define추가합니다.반드시순서를지켜야합니다.

#defineCRTDBG_MAP_ALLOC

#include<stdlib.h>

#include<crtdbg.h>

 

덤프를보고자하는위치에서아래함수를호출합니다.

아래함수는메모리릭이발생한위치를덤프하여,출력창에표시합니다.

_CrtDumpMemoryLeaks();

 

아래는완성된전체예제입니다.

#include"stdafx.h"

//아래헤더가추가되었습니다.

#defineCRTDBG_MAP_ALLOC

#include<stdlib.h>

#include<crtdbg.h>

 

voidalloc()

{

          //여기서메모리를할당하고, free하지않아메모리릭을유발합니다.

          char*p= (char*)malloc(1024);

}

 

int_tmain(intargc,_TCHAR*argv[])

{

          alloc();

          //메모리덤프를출력창에표시합니다.

          _CrtDumpMemoryLeaks();

 

          return0;

}

 

char*p= (char*)malloc(1024);부분에서메모리를할당한후에해제하지않았기때문에위에프로그램은메모리릭이발생하며,우리가추가한소스때문에Visual Studio친절히도출력창에메모리릭을표시하여줍니다.

컴파일한후에F5눌러서디버깅을종료해볼까요???

아래와같은정보가출력창에표시됩니다.

 

사용자 삽입 이미지

 

 

 

 

 

 

Detected memory leaks!

Dumping objects ->

{42}normal block at0x003710B0, 1024 bytes long.

 Data: <               > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

 

위에빨강색강조는물론중요해서했습니다..

{42}allocation number이며뒤에0x003710B0할당된메모리위치입니다.

먼저Allocation number찾는방법과할당된메모리주소로찾는방법을알려드리겠습니다.

 

먼저단일스레드런타임을사용하였는지다중스레드런타임을사용하였는지확인해주세요.다중스레드런타임라이브러리사용유무는C/C++ ->코드생성에서확인있습니다.

 

사용자 삽입 이미지

 

_tmain브레이크포인터를걸고F5디버깅하여, _tmain에서trap걸리면Watch창에아래와같이써주세요.

 

 

단일스레드라이브러리

_crtBreakAlloc

42

다중스레드라이브러리

{,,msvcr71d.dll}_crtBreakAlloc

42

사용자 삽입 이미지

 

42릭이발생한Allocation Number입니다.

위와같이입력후에F5눌러서계속실행시키시면, 42Allocation Number값이할당되는순간아래와같은다이얼로그가뜨며,중단을누르고,호출스택을보면42Allocation Number할당을시도한부분을찾을있습니다.

 

사용자 삽입 이미지

 

 

 

 

 

 

 

아래는중단을누르고스택을확인한결과입니다.

정확히메모리할당을시작하고, free하지않은곳을잡아냈습니다^^

 

사용자 삽입 이미지

 

외에여러방법도있습니다.

어떠한경우Allocation Number실행시마다변경될있으며,

경우에는항시동일한동작순서대로해주세요.

예를들면프로그램을켜자마자어떠한기능을수행시킨다던지...

처음글쓸두가지방법을설명해드린다고했었는데..두번째방법은Allocation Number변경되는경우유용한방법인데...

..다시귀나치즘이몰려오고있습니다..두번째방법은다음번에쓰겠습니다.

참고로아주아주예전에썼던맵파일을활용하자

(http://www.devpia.com/Forum/BoardView.aspx?no=7175&ref=7175&forumname=VC_LEC&stype=VCF&KeyW=%b8%ca+%c6%c4%c0%cf&KeyR=title)

후속편도작성한다고했었는데아직까지작성을안하고있었네요...

여름태풍이오기전까지올리도록하겠습니다^^

20060321

-특공홍기-



==== 출처 : 데브피아 VC++ 강좌와 TIP 자료실 ====