본문 바로가기
C | C++ | VC++

[Tip] MemoryLeaks 메모리릭,메모리누수 실시간 디버깅하여 잡기

by 두루물 2010. 12. 14.

[팁하나]
디버그 모드에서 응용프로그램이 끝나면서 쏟아지는 Detected Memory Leaks! 가 많다면,분명 간과할 일이 아니다. 왜냐하면, 단 몇 바이트가 세더라도 365일 풀 가동되는 서비스나 기업 및 상업용 프로그램의 경우는 제품과 개발자,나아가 회사에 너무나도 치명적일 수 있기 때문이다.
단순 무식하게 하면 지정된 때에 재시작 하도록 하면 되겠지만... 기본적인 메모리누수를 잡지 않으면,언젠가 기억도 가물한 업체나 바이어에게서 연락이 올지도 모를 일이다.

이와 비슷한 도구로 Vld를 비롯하여 본 내용과 유사한 다른 글들이 인터넷에 다수 존재하지만,따라해도 마치 퍼오고 확인은 안한 글들처럼 실행도 안되고 불확실 하다. 또 Vld같은 경우는 디버그 툴이면서도 버그를 내장한 것을 직접 경험한 바 있는데,의외로,핵심적인 것만 추려서 여기에 간단한 방법을 소개한다.

시작!

프로그램 시작 지점에서,
 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
 //_CrtSetReportMode(_CRT_ERROR,_CRTDBG_MODE_DEBUG);
 //AfxEnableMemoryTracking(allocMemDF|checkAlwaysMemDF);
 //_CrtSetBreakAlloc(5551);

를 선언한 후,

조사식창에 _crtBreakAlloc 를 입력한 후 값에 출력창에 나타나는 메모리릭 디버깅 정보에서
{} 블럭 사이의 메모리 할당번호를 입력한후 F5누르면 해당 번째 메모리가 할당되는 지점에서 Break가 걸린다.만약 _crtBreakAlloc 값이 제대로 활성화가 안되면 자신이 사용하는 각 버전에 맞는 msvcrxxd.DLL 로 (예: {,,msvcr90d.dll}_crtBreakAlloc) 로 추가한 다음(사실 특히 이부분에 대해 대부분 모를 것이다,이글을 쓰는 핵심 포인트는 바로 이것이라 해도 과언이 아니다) app의 소멸자에서 _CrtDumpMemoryLeaks();를 추가하면 메모리릭 발생시 뜨는 Detect Memory Leaks! 의 {} 번호를 값에 입력한다.
실행 처음시, 브레이크 포인트 걸면 해당 번호에 메모리 할당될때 break 걸린다.
또는,위 주석 내용중 _CrtSetBreakAlloc(5551); 처럼 직접 메모리 할당하는 순번을 직접 적어줘도 된다.

단,코드생성 옵션값 중 런타임라이브러리를 MT가 아닌 - 다중쓰레드 디버그 DLL /MDd 선택해야 한다.

출처:본인(http://krkim.net/128)