본문 바로가기
프로그래밍/MFC

오류 해결 - 메모리 Leck 위치 찾기

by 완소루피 2020. 11. 13.
728x90
반응형

[출력 로그]

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {26109} client block at 0x04AD0518, subtype c0, 68 bytes long.

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {26064} client block at 0x04AB68E0, subtype c0, 68 bytes long.

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {565} normal block at 0x04A7DDB8, 20 bytes long.


위의 붉게 표시한 숫자는 Memory Allocation Number 라 불린다. 간단하게 프로그램 내의 메모리 할당 주소다.
우리는 이 메모리 번지수를 할당하는 소스라인으로 가기만 한다면, Game Over 다.
메모리 번지수를 Break해주는 함수는 아래와 같다.

  • #include <crtdbg.h>
    long _CrtSetBreakAlloc(long _BreakAlloc)

  • void AfxSetAllocStop(LONG lRequestNumber)

위 두 함수를 사용하면 된다.
_CrtSetBreakAlloc 같은 경우는 dll이나 다른 용도로도 사용하고자 할때 쓰이고.. (자세히 몰름)
AfxSetAllocStop 같은 경우는 MFC에서 include 없이 사용하면 된다.


각 인자값에 메모리 번지수를 넣어주면, 그 메모리 번지수에 최초로 메모리를 할당하는 부분에서 Break Point가 걸린다. 직접 해보는게 빠른길 ^_^


하지만 결론적으로 저 두 함수만으로 모든 메모리 릭 나는 부분을 찾는건 불가능하다..
VST 출력 로고에 매번 Memory Allocation Number 가 달라 지는 경우도 있기 때문이다 (!)MFC Socket 같은 경우가 그러했다. (접속 스레드나, 뭐 이런저런 상황에..? 하튼 MFC Socket 저주스럽다..)
여튼...상황에 따라 매우 매우 very very 유용한 함수 이니... 알아두면 좋다 !

728x90
반응형