programming2008. 5. 8. 19:30

Visual Studio 에서 Debug 모드로 실행파일을 실행하고 종료할때 Output 창에 메모리릭이 표시된다.
Win32 콘솔 프로젝트를 만들어서 테스트를 해보자.

사용자 삽입 이미지











다음과 같은 코드를 만들어서 F5 키를 눌러 디버그 해본다.
이게 어쩐일인가 ? Output 창에 메모리릭에 대한 정보가 없다.  ㅡㅡ

다음 코드를 추가해야 나타난다.

사용자 삽입 이미지












% 참고로 콘솔 프로젝트가 아닌 MFC 로 프로젝트를 만들면 이와 같은 추가 작업이 필요없다.

이제 다시 F5 키를 눌러서 Debug 해보자.

다음과 같이 출력될 것이다.

'TestLeak.exe': 'C:\Documents and Settings\Administrator\바탕 화면\TestLeak\Debug\TestLeak.exe' 로드, 기호가 로드되었습니다.
'TestLeak.exe': 'C:\WINDOWS\system32\ntdll.dll' 로드, 기호가 로드되지 않았습니다.
'TestLeak.exe': 'C:\WINDOWS\system32\kernel32.dll' 로드, 기호가 로드되지 않았습니다.
Detected memory leaks!
Dumping objects ->
{41} normal block at 0x00370FF0, 4 bytes long.
 Data: <    > CD CD CD CD
Object dump complete.

'[2536] TestLeak.exe: 네이티브' 프로그램이 0 (0x0) 코드에서 끝났습니다.

이 부분이 메모리 릭 발생 부분이다.

CRT 라이브러리는 프로그램이 실행되고 부터 메모리 생성을 순차적으로 카운트 한다. 그것을 표시한 부분이 {41} 이다. 이것은 41번째로 생성된 메모리가 해제가 안되었다는 것이다. 41 번째 메모리 생성의 의미는 내가 직접 생성한 메모리 이외에도 내가 사용하는 라이브러(MFC 라이브러리, CRT 라이브러리, 등 모든 라이브러리를 포함)에서 생성한 메모리를 모두 카운트 한 수치이다.

이제 메모리가 해제되지 않는 부분을 찾아보자

먼저 OUTPUT 창에서 메모리 릭이 발생한 부분을 더블클릭했을때, 소스로 이동하는 경우가 있다.
이럴때는 감사하게 소스로 이동해서 수정하면된다. ^^; 그리고 밑의 내용을 보지 않아도 되겠다.

먼저 코드를 보자
사용자 삽입 이미지


















_CrtSetBreakAlloc(41);  함수가 추가 되었다.
이것의 역할은 메모리가 41 번재 생성될때 자동으로 브레이크 포인트가 걸리도록 해준다.
 브레이크 포인트가 걸리면 CallStack 창에서 메모리 생성 부분을 찾아 가는 것은 어려운 일이 아닐것이다.

마무리 해보자.
꽤 유용한 방법이지만 이 방법을 쓸수 있는 경우는 그리 많지 않다. 왜냐 하면 프로그램이 항상 같은 루틴으로 동작하는 일이 거의 없기 때문이다. 이 말은 같은 소스 부분이라도 프로그램을 사용하는 방법에 따라 메모리 생성 순서가 변경될수 있다는 말이다. (같은 패턴을 찾으면 가능하겠지만 ...)

% Visual Studio 6 만 한 6~7년간 사용했었다. ㅡㅡ; VS60 기준으로 보면 메모리릭 탐지 기능이 너무 안좋았었다. 생성 해제 부분을 좀 꼬아 버리면 해제 해도 릭이라고 표시되는 부분이 많았다. 지금은 VS2008 까지 나왔으니 이젠 좀 괜찮아 졌겠지 ???

Posted by 상현달