gpg2 2 1_10_드롭인디버그메모리관리자

10
[GPG2.1.10] 드드 - 드 드드드 드드드 드드드 [DevRookie] 드드드드

Upload: young-jun-jeong

Post on 25-May-2015

703 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Gpg2 2 1_10_드롭인디버그메모리관리자

[GPG2.1.10]드롭 - 인 디버그 메모리 관리자

[DevRookie] 꽝매니아

Page 2: Gpg2 2 1_10_드롭인디버그메모리관리자

개요 시작 메모리 관리자의 로그 기록 결과 보고 몇 가지 염두에 둘 것들 개선 방향

차례

Page 3: Gpg2 2 1_10_드롭인디버그메모리관리자

점점 커져가는 게임 프로그램 점점 필요해지는 메모리 사용 관리 메모리 사용 상태에 대한 분석 기능을 요구 사용하기 편하게 만들어야 한다 . 자료 분석을 위한 비용에 대한 부담을 줄여야 한다 . 최소한 디버그 빌드나 매크로 정의 빌드로 분석한다 .

개요

Page 4: Gpg2 2 1_10_드롭인디버그메모리관리자

메모리 할당 / 해제 하는 new/delete 루틴을 오버로딩 한다 .

오버로딩한 함수에서 필요한 정보를 받을 수 있게 #define 매크로 로 메모리 명령문들을 재정의 한다 .

책에는 Visual C++ 에서 정의하는 __FILE__, __-LINE__ 을 사용한다 .

이를 통해 메모리에 접근할 때 할당크기 , 파일(__FILE__) 이름 , 행번호 등을 받을 수 있게 한다 .

시작

Page 5: Gpg2 2 1_10_드롭인디버그메모리관리자

메모리 사용 정보를 연쇄 헤쉬 테이블에 저장한다 . Chained hash table 이 뭐냐구요 ? (map + linked

list) 할당 사이즈 ( 주소 ), 앞뒤 여백 , 할당 종류 , 파일이름 ,

소스 라인 등 정보를 구조체로 저장한다 . 테이블에는 현재 할당된 메모리 정보들만 남게 해서 ,

프로그램 종료시 남은 구조체를 확인해서 누수를 확인한다 . 메모리 할당 위치 앞뒤에 여백경계를 준 상태로 할당한다 .

메모리 관리자의 로그 기록

Page 6: Gpg2 2 1_10_드롭인디버그메모리관리자

여백 공간에 정해진 32 비트 값을 채우고 해제할 때 값을 비교해서 침범했는지 확인한다 .

메모리 관리자가 할당 용량 , 실제 쓰인 용량 ( 여백제외 ), 가장 큰 메모리 블록 정보 등을 관리한다 .

경계 영역에 해당한 값으로 초기 할당값을 사용한다 . 이렇게 하면 따로 경계 영역을 위한 기록을 할 필요가 없다 . 그래서 내용에서는 32 비트 long 값을 이용한다 . 만약 , 맞아 떨어지지 않으면 0xE 나 static_cast 로 초기화

메모리 관리자의 로그 기록

Page 7: Gpg2 2 1_10_드롭인디버그메모리관리자

메모리 관리자가 해제될 때 결과를 기록한다 . 메모리 관리자는 제일 먼저 생성되고 제일 나중에

소멸해야 된다 . Visual C++ 에서는 헤더파일의 정적 개체를 코드

출현 순으로 생성하고 , 반대 순서로 해제함을 이용한다 . ::ateexit() 에 맨 먼저 등록해서 제일 나중에

호출되게 한다 .

결과 보고

Page 8: Gpg2 2 1_10_드롭인디버그메모리관리자

STL 을 사용할때 헤더파일 순서로 인해 오류가 발생할 수 있으므로 , 커스텀 할당 / 해제 매크로 헤더 파일을 #define, #undefine 하는 헤더 2 개를 사용한다 .

처음엔 #undefine 하고 난 다음에 STL 헤더를 in-clude 하고 그 다음에 #define 하게 해준다 .

몇 가지 염두할 점

Page 9: Gpg2 2 1_10_드롭인디버그메모리관리자

MFC 처럼 자체적으로 메모리 할당 / 해제 루틴을 쓰는 라이브러리를 같이 쓰게 될 경우 , 이때 사용하고 있는 메모리 관리자를 겹치지 않게 하기 위해 위 방법 처럼 #ifdef 로 순서를 처리해준다 .

몇 가지 염두할 점

Page 10: Gpg2 2 1_10_드롭인디버그메모리관리자

상용 엔진에서는 어떻게 사용하고 있을까 ? Gamebryo 에서 사용하는 NiMemoryTracker

기능

실전 예제