디버그 환경에서 재현되는 메모리 릭의 경우 가장 편리하게 디버깅하는 방법은 CRT Debug 함수를 사용하는 것입니다.
_CrtSetDbgFlag() API를 사용하면 VS에서 Debug 실행 종료시 DebugString으로 Leak 내용이 출력됩니다. (MFC의 경우 디폴트로 세팅됨)
코드 시작부분에 다음과 같이 선언해주면 함수 종료시 메모리 릭 여부를 체크하여 릭이 있을 경우 아래과 같이 DebugString으로 출력해 줍니다.
메시지 중 "{50}"이라는 숫자가 있는데 MSDN에서는 이걸 "Allocation order number"라고 소개하고 있습니다. 말하자면, 50번째로 할당된 메모리에서 Leak이 발생했다는 의미이죠.
이때 _CrtSetBreakAlloc() 함수에 저 번호를 넘겨주면 해당 메모리가 할당된 지점에서 BreakPoint가 걸립니다.
이제 VisualStudio의 CallStack 창에서 해당 메모리가 어디서 할당되었는지 확인만 하시면 되시겠습니다.
단, 위의 함수들은 Debug Only!! ^^ 만약 릴리즈환경에서 오랫동안 실행되어야 확인되는 오류라면 LeakDiag 등 메모리누수 탐지 도구를 사용해야 합니다. 또, 멀티스레드라던가 해서 여러번 실행했을 때 메모리 할당순서가 매번 바뀌는 경우라면 이 방법(CRT Debug함수)은 소용 없을 듯 합니다. 메모리가 할당된 번호를 기준으로 BP를 거니까요..
자세한 내용은 여기에...
아래 글에서는 CRT 디버그함수를 이용해 메모리누수 뿐만 아니라 delete된 메모리를 재사용하는 오류, 배열의 경계를 침범하는 오류 등을 체크하는 방법도 소개되어 있네요. ^^
좋은 내용 공유해주신 again4you 님과 gazette2 님께 감사! ^^
_CrtSetDbgFlag() API를 사용하면 VS에서 Debug 실행 종료시 DebugString으로 Leak 내용이 출력됩니다. (MFC의 경우 디폴트로 세팅됨)
코드 시작부분에 다음과 같이 선언해주면 함수 종료시 메모리 릭 여부를 체크하여 릭이 있을 경우 아래과 같이 DebugString으로 출력해 줍니다.
Detected memory leaks!
Dumping objects ->
c:\program files\microsoft visual studio 8\vc\include\crtdbg.h(1150) : {50} normal block at 0x003A2F50, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The program '[3868] MemoryLeakTest.exe: Native' has exited with code 0 (0x0).
Dumping objects ->
c:\program files\microsoft visual studio 8\vc\include\crtdbg.h(1150) : {50} normal block at 0x003A2F50, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The program '[3868] MemoryLeakTest.exe: Native' has exited with code 0 (0x0).
메시지 중 "{50}"이라는 숫자가 있는데 MSDN에서는 이걸 "Allocation order number"라고 소개하고 있습니다. 말하자면, 50번째로 할당된 메모리에서 Leak이 발생했다는 의미이죠.
이때 _CrtSetBreakAlloc() 함수에 저 번호를 넘겨주면 해당 메모리가 할당된 지점에서 BreakPoint가 걸립니다.
이제 VisualStudio의 CallStack 창에서 해당 메모리가 어디서 할당되었는지 확인만 하시면 되시겠습니다.
단, 위의 함수들은 Debug Only!! ^^ 만약 릴리즈환경에서 오랫동안 실행되어야 확인되는 오류라면 LeakDiag 등 메모리누수 탐지 도구를 사용해야 합니다. 또, 멀티스레드라던가 해서 여러번 실행했을 때 메모리 할당순서가 매번 바뀌는 경우라면 이 방법(CRT Debug함수)은 소용 없을 듯 합니다. 메모리가 할당된 번호를 기준으로 BP를 거니까요..
자세한 내용은 여기에...
http://again4you.egloos.com/1350482
아래 글에서는 CRT 디버그함수를 이용해 메모리누수 뿐만 아니라 delete된 메모리를 재사용하는 오류, 배열의 경계를 침범하는 오류 등을 체크하는 방법도 소개되어 있네요. ^^
http://challengeok.tistory.com/entry/%ED%8E%8C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%EB%94%94%EB%B2%84%EA%B9%85(가급적이면 원본 글을 찾아서 링크하려고 했는데... 원본은 없어진 것 같고 퍼온글들만 10여건이 검색되네요. ^^;;)
좋은 내용 공유해주신 again4you 님과 gazette2 님께 감사! ^^
'C++ > Debug' 카테고리의 다른 글
Debugging Tips (5) - Crash 발생시 자동으로 디버깅 정보 기록하기 (2) | 2009.10.14 |
---|---|
Leak Debugging(2) - LeakDiag로 메모리 누수 디버깅하기 (Debugging Memory Leak with LeakDiag) (13) | 2009.10.12 |
Process Explorer와 디버그 심볼(PDB 파일)을 이용해 실행중인 프로세스 분석하기 (0) | 2009.06.04 |
Debugging Tips (4) - Call Stack 추적하기 (StackWalk) (15) | 2009.03.28 |
Debugging Tips (3) - Just-In-Time Debugger를 이용하는 방법 (3) | 2009.03.02 |