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 까지 나왔으니 이젠 좀 괜찮아 졌겠지 ???
'programming' 카테고리의 다른 글
64 bit 지원하기 (0) | 2009.04.03 |
---|---|
printf, va_list 사용시 제어문자, 서식문자 정리 (0) | 2008.09.08 |
MS-SQL Stored procedures 에서 Select 와 Output Parameter 동시 사용시 주의점 (0) | 2008.08.04 |
[DATA] Turbo C++ 3.0 (2) | 2008.05.12 |
Byte Alignment (바이트 정렬) (2) | 2008.04.30 |