CRT 라이브러리를 사용해 메모리 누수(Leak) 찾기..

Posted by KimJa
2016. 1. 22. 01:18 Visual Studio

D2D프레임워크를 만들어보자 해서 코드를 짜던중 프로세스가 남아있는 버그가 발생했다.

메모리 디버깅하는 방법을 찾던 중 코드에서 한번에 찝어볼 수 있는 방법을 찾았다.

방법은 간단하게 헤더 포함 후 코드 삽입.

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


MSDN에서는 포함할때의 순서로 위의 순서를 권장하고 있다.

_CRTDBG_MAP_ALLOC를 정의 해줌으로써 어느 파일의 몇번째 라인까지 표시를 해준다는것 같은데.. 내 코드에선 작동하지 않더라..

우선 누수 되는 곳을 찾으려면 다음과 같이 프로그램의 종료지점에 한줄만 삽입하면 된다.

System->Shutdown();
delete System;
System = 0;
	
_CrtDumpMemoryLeaks();

return 0;

코드를 수정했으면 F5(디버그 모드)로 실행한다.

그러면 출력(Output)창에서 코드 실행 시점에서 해제되지 않은 메모리를 잡아서 보여준다.

메모리 할당 번호, 블록형식, 16진수 메모리 위치, 블록 크기

블록 내 첫 16비트 데이터

찍히는 로그는 이러한 형식이다.

블록 형식에 대한 설명은 MSDN에서 더 자세히 볼 수 있다.(링크)

이제 메모리 할당 번호를 가지고 메모리가 할당 되는 부분에 중단점을 설정할 수 있다.

_CrtSetBreakAlloc(할당 번호);

프로그램의 시작지점에 코드를 삽입하고 다시 디버그 모드로 실행하면 해당 할당 번호의 메모리가 할당 되는 위치에서 중단된다.


MSDN 페이지 - https://msdn.microsoft.com/ko-kr/library/x98tx3cf.aspx

'Visual Studio' 카테고리의 다른 글

Visual Studio 2013 라이브러리 경로에 대한 깨달음  (0) 2015.11.29