Kevin Dominic의 Studying Rock Drill~

DirectX 기반 프로그램에서 메모리릭 발생시 찾아내는 방법 본문

Study/전공

DirectX 기반 프로그램에서 메모리릭 발생시 찾아내는 방법

Kevin Dominic 2012. 1. 22. 01:05
출처 : http://proline1.cafe24.com/zeroboard/view.php?id=data&page=1&sn1=&divpage=1&category=4&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=166&PHPSESSID=bc40cf8c7ae822b43794d6bb6d213cd3
----------------------------------------------------------------------------------------------------

안녕하세요 볼따구 입니다.

인터넷에서 좋은 정보 찾아서 올립니다.

DirectX의 경우에는 COM기반의 프로그래밍 언어인데 인터페이스를 얻어온 후 Release를 하지 않았거나 혹은 AddRef()로 늘어난 래퍼런스 카운터에 맞게 Release()가 호출이 되지 않았다면 릭이 발생할 수 있다.

간혹 이런 경우 위의 함수들이 메모리릭을 일으킨 정확한 시점을 감지하지 못하는 경우가 생긴다. 그 때에는 D3DX에서 출력창에 띄워준 정보를 바탕으로 메모리릭을 찾을 수 있다.


D3DX: MEMORY LEAKS DETECTED: 3 allocations unfreed (708 bytes)
D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x21b to debug



위에서 봤던 출력창 메시지의 제일 마지막 2줄이다.

아래와 같은 순서로 메모리릭을 일으킨 인터페이스가 생성되는 시점을 찾을 수 있다.


1. 시작프로그램의 실행에서 REGEDIT를 실행해서 레지스트리 편집기를 실행하자.

2. HKEY_LOCAL_MACHINE -> SOFTWARE -> Microsoft -> Direct3D 의 위치로 이동

   ( 설명된 위치 이외의 키들을 건드릴 경우 시스템에 치명적인 손상을 줄 수 있음 )

3. D3DXBreakOnAllocId 라는 키가 존재하는 지 확인 하고 없을 경우에는

   새로만들기 -> DWORD값 으로 새 키를 만들어 주고 이름을 위와 같이 설정 해 주자.

   ( 비슷한 이름의 키가 존재할 수 있으니 이름이 정확히 맞는지 확인할 것 ! )

4. 값에 16진수로 0x21b값을 적어주자.

   ( 이 값은 출력창에 표시된 위의 값이다. 0x는 빼고 적어주자. )

5. 이제 디버그 모드로 실행을 시키면 메모리릭을 일으킨 범인이 할당되는 순간

   브레이크 포인트를 걸고 제어권을 사용자에게 넘겨준다.