[팁하나]
디버그 모드에서 응용프로그램이 끝나면서 쏟아지는 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)
'C | C++ | VC++' 카테고리의 다른 글
[Tip] VS2008 MFC 프로젝트 afximpl.h 파일찾기 또는 컴파일 오류 (0) | 2011.04.01 |
---|---|
2분법을 이용한 이진탐색(Binary Search) 샘플코드 (0) | 2010.12.23 |
[Tip]첫째 예외가 있습니다. first-chance exception RPC 서버를 사용할 수 없습니다 (0) | 2010.11.22 |
[Tip] UAC 와 CreateProcess의 ERROR_ELEVATION_REQUIRED,SendMessage의 ERROR_ACCESS_DENIED (0) | 2010.09.29 |
[Tip]32bit 프로그램에서 64bit DLL DllRegisterServer 등록하기 (5) | 2010.09.24 |