2009. 3. 27. 14:31

메모리 릭 디버깅 하기

Detected memory leaks!
Dumping objects ->
f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {128} normal block at 0x003BDF90, 50 bytes long.
 Data: < 9Px            > AC 39 50 78 10 00 00 00 10 00 00 00 01 00 00 00


위와 같은 메시지가 Output 창에 출력되었을 때 어디에서 메모리 누수가 발생하였는지를 발견하는 것은 쉽지 않다. 이런 경우 디버깅하는 방법에 대해서 소개한다.

F10 (Debug > Step Over) 를 눌러서 디버그를 시작한다. F5가 아니라 F10으로 디버깅을 시작하면 main 함수에서부터 시작한다.

이때 중단점 창을 연후 위 출력창에서 출력된 메시지에서 Normal Block 주소(0x003BDF90) 에다가 중단점을 건다.


중단점을 만든 후에, F5를 눌러 다시 디버깅을 재개하면 해당 데이터 주소에 접근을 시도할 때에 아래 메시지박스가 뜨면서 중단점이 걸린다.


확인을 눌러 디버깅 모드로 진입하면, 콜 스택을 볼 수 있는데 콜 스택을 주의깊게 살펴보면 어디에서 메모리로 할당하였는지를 알 수 있다.


이 예에서는 CUIThread::InitInstance에서 new 를 이용하여 할당했던 메모리를 delete 하지 않았음을 알 수 있다.

이렇게 직접 디버깅하는 방법도 있지만 Visual C++에서 제공하는 다른 방법도 있다. 아래 글 참고

Detecting and Isolating Memory Leaks Using Microsoft Visual C++