| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- parser
- SpaceGoldRush
- msocache
- 현실 도피
- Mesh Parser
- Slerp
- msocache 제거
- Cam Parser
- VC 6.0 컴파일러 오류
- EngineKarbia Developing
- Shader Model
- interpolation
- 리눅스 하드 추가
- Sgr
- Verbose
- 이중 템플릿
- Camera Parser
- Interpolation Spline
- Ogre XML
- ListTool
- partition master
- Form factor
- Linux Shutdown
- VC 6.0 템플릿
- articles
- Violation
- EK3D
- Proteus VX
- Certificated
- 상콤한 에러?
- Today
- Total
Kevin Dominic의 Studying Rock Drill~
DirectX 사용시 D3DX Memory Leak 발생시 에러 위치 찾는 법 본문
안녕하세요 볼따구 입니다.
인터넷에서 좋은 정보 찾아서 올립니다.
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. 이제 디버그 모드로 실행을 시키면 메모리릭을 일으킨 범인이 할당되는 순간
브레이크 포인트를 걸고 제어권을 사용자에게 넘겨준다.
'Study > 전공' 카테고리의 다른 글
| std::stringstream 사용법 (0) | 2012.07.08 |
|---|---|
| 메모리 릭 찾아내기 (0) | 2012.01.22 |
| DirectX 기반 프로그램에서 메모리릭 발생시 찾아내는 방법 (0) | 2012.01.22 |
| IGameExporter에서 Mesh 추출 시 유의사항 (0) | 2011.08.16 |
| Remote Debugging (0) | 2011.07.29 |