2014-07-08 2 views
3

, 그것은 읽tcmalloc 사용 - malloc 확장을 올바르게로드하는 방법? 파일 gperftools-2.2.1/src에/gperftools/malloc_extension.h에서

// Extra extensions exported by some malloc implementations. These 
// extensions are accessed through a virtual base class so an 
// application can link against a malloc that does not implement these 
// extensions, and it will get default versions that do nothing. 
// 
// NOTE FOR C USERS: If you wish to use this functionality from within 
// a C program, see malloc_extension_c.h. 

내 질문은 내가 가상 기본 클래스를 통해 이러한 확장에 액세스 할 수있는 방법을 정확히?

일반적으로 동적 라이브러리에서 클래스를로드하려면 here과 같이 다형성을 통해 원하는 클래스와 함수의 인스턴스를 가져올 수있는 기본 클래스를 작성해야합니다.

그러나 이렇게하려면 API에서 사용할 수있는 클래스 팩토리 함수가 있어야하지만 tcmalloc 파일에는 이러한 함수가 없습니다. 또한 나는 또한 설치 노트에 따라 사용하지 않는 것이 좋습니다 dlopen을 가진 tcmalloc 라이브러리(),로드해야합니다 : dlopen을 통해 malloc에-교체 용 라이브러리를로드 ...

은 어떤 경우에 문제가 요구 입니다 : 일부 데이터는 하나의 malloc으로 할당되고 다른 일부는 다른 것으로 할당됩니다.

위에서 언급 한 일반적인 방법으로 확장 프로그램에 분명히 액세스하는 것은 옵션이 아닙니다. malloc_extensions_c.h에 선언 된대로 C 버전을 사용하여 제거 할 수 있지만 더 나은 해결책이 있는지 궁금합니다.

답변

0

malloc 확장을 일부 'hack'을 통해로드 할 수있었습니다. 이는 내가 선호하는만큼 깨끗하지는 않지만, 완료되었습니다. 여기에 관심있는 사람들을위한 (일시적인) 해결책이 있습니다.

먼저 malloc 확장 함수의 대부분은 정적 함수와 비슷합니다. 대부분의 경우 이러한 함수는 대부분 현재 인스턴스에서만 호출됩니다. MallocExtension::instance()->GetMemoryReleaseRate()이라고 부르는 현재 프로세스에서 GetMemoryReleaseRate() 함수를 호출하십시오. 따라서 우리는 기본 클래스를 생성하고 이러한 함수를 호출하기 위해 MallocExtension 클래스의 인스턴스를 가져올 필요가 없습니다. 위의 예를 들어

은, 그냥 다음과 같이 간단하게 불려갑니다 필요한 함수를 호출하는 독립 기능 getMemoryReleaseRate()을 만들 것입니다 :

이 기능은 소스에 직접 삽입 할 수
getMemoryReleaseRate() 
{ 
    MallocExtension::instance()->GetMemoryReleaseRate(); 
} 

파일, 예. tcmalloc.cc 또는 컴파일 할 때 소스 파일에 첨부 할 새 버전이있을 때마다 tcmalloc 소스를 편집하지 않으려면 makefile에 추가하십시오.

이제 코드에서 dlsym()을 통해 만든 'facade'함수를 통해 MallocExtension 함수를 호출 할 수 있습니다. 다음과 같이 :

typedef void (*getMemoryReleaseRate)(); 
((getMemoryReleaseRate)dlsym(RTLD_DEFAULT, "getMemoryReleaseRate"))(); 
0

이 헤더를 포함하고 MallocExtension :: instance() -> GetMemoryReleaseRate(); 너무 일할 것입니다. 이를 위해 tcmalloc을 수정할 필요가 없습니다.