메모리릭을제거하자#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를눌러서계속실행시키시면, 42번Allocation Number에값이할당되는순간아래와같은다이얼로그가뜨며,중단을누르고,호출스택을보면42번Allocation 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)
후속편도작성한다고했었는데아직까지작성을안하고있었네요...
올여름태풍이오기전까지올리도록하겠습니다^^
-특공홍기-
==== 출처 : 데브피아 VC++ 강좌와 TIP 자료실 ====
'Programming > MFC' 카테고리의 다른 글
VC++ 프로젝트 속성( 구성 관리자 ) (1) | 2007.09.05 |
---|---|
리스트 박스 마지막 줄 표시 (0) | 2007.08.31 |
[Error message] Warning: skipping non-radio button .. (0) | 2007.08.09 |
ReadFile (0) | 2007.07.17 |
메뉴에 항목을 넣고 활성화 시키고, 메시지 받아오기 (0) | 2007.06.12 |