블로그 이미지
fiadot_old

칼퇴근을 위한 게임 서버 개발 방법론에 대한 심도있는 고찰 및 성찰을 위한 블로그!

Rss feed Tistory
Technical Article/펌 2005. 8. 4. 10:46

WIN32에서 MFC의 메모리 누수 체크기능을 써보자

http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsdebug/html/vxconenablingmemoryleakdetection.asp

메모리 누수 탐지 기능 사용

메모리 누수를 탐지하는 데 사용하는 기본 도구는 디버거와 CRT 디버그 힙 함수입니다. 디버그 힙 함수를 사용하려면 다음 문이 프로그램에 포함되어 있어야 합니다.

#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
참고   #include 문은 위의 순서를 따라야 합니다. 순서를 변경하면 함수를 사용해도 제대로 작동하지 않습니다.

crtdbg.h를 포함하여, 메모리 할당과 할당 취소를 추적하는 해당 디버그 버전, _malloc_dbg 및 _free_dbg에 malloc와 free 함수를 매핑합니다. 이 매핑은 _DEBUG가 정의된 디버그 빌드에서만 발생합니다. 릴리스 빌드에서는 일반적인 malloc 함수와 free 함수가 사용됩니다.

#define 문은 CRT 힙 함수의 기본 버전을 해당 디버그 버전에 매핑합니다. 이 문을 반드시 사용할 필요는 없지만 사용하지 않으면 메모리 누수 덤프에 별로 유용하지 않은 정보가 포함될 수 있습니다.

위에서 설명한 문을 추가한 후 프로그램에 다음 문을 포함하여 메모리 누수 정보를 덤프할 수 있습니다.

_CrtDumpMemoryLeaks();

디버거에서 프로그램을 실행하면 _CrtDumpMemoryLeaks가 출력 창에 메모리 누수 정보를 표시합니다. 메모리 누수 정보가 다음과 같이 표시됩니다.

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

#define _CRTDBG_MAP_ALLOC 문을 사용하지 않으면 메모리 누수 덤프가 다음과 같이 표시됩니다.

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

_CRTDBG_MAP_ALLOC가 정의되지 않으면 다음 사항이 표시됩니다.

  • 메모리 할당 번호(중괄호 안에 표시)
  • 블록 형식(표준, 클라이언트 또는 CRT)
  • 16진수로 표기한 메모리 위치
  • 바이트로 표기한 블록 크기
  • 16진수로 표기한 처음 16바이트의 내용

_CRTDBG_MAP_ALLOC가 정의되면 누수된 메모리가 할당된 파일을 찾을 수 있습니다. 파일 이름 뒤에 오는 괄호 안의 숫자(예: 20)는 파일에서의 줄 번호입니다.

메모리가 할당된 소스 파일의 줄로 이동하려면

  • 출력 창에서 파일 이름과 줄 번호가 있는 줄을 두 번 클릭합니다.

    - 또는 -

  • 출력 창에서 파일 이름과 줄 번호가 있는 줄을 선택하고 F4 키를 누릅니다.

_CrtSetDbgFlag

프로그램이 항상 같은 위치에서 종료되는 경우에는 _CrtDumpMemoryLeaks를 쉽게 호출할 수 있습니다. 그러나 프로그램이 여러 위치에서 종료되는 경우를 생각해 보십시오. 종료할 수 있는 모든 위치에서 _CrtDumpMemoryLeaks를 호출하는 대신 프로그램 시작 부분에 다음 호출을 포함할 수 있습니다.

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

이 문은 프로그램이 종료될 때 자동으로 _CrtDumpMemoryLeaks를 호출합니다. 위의 예제와 같이 비트 필드 _CRTDBG_ALLOC_MEM_DF_CRTDBG_LEAK_CHECK_DF를 모두 설정해야 합니다.

CRT 보고서 모드 설정

기본적으로 _CrtDumpMemoryLeaks는 위에서 설명한 대로 출력 창의 디버그 창으로 메모리 누수 정보를 덤프합니다. _CrtSetReportMode를 사용해 다른 위치로 덤프하도록 다시 설정할 수 있습니다. 라이브러리를 사용할 경우 출력을 다른 위치로 다시 설정할 수 있습니다. 이 경우 다음 문을 사용하여 출력 위치를 출력 창으로 다시 설정할 수 있습니다.

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

_CrtSetReportMode를 사용하여 출력을 다른 위치로 보내는 방법은 _CrtSetReportMode를 참조하십시오.

참고 항목

메모리 누수 탐지 및 격리

,
TOTAL TODAY