2012-07-06 2 views
4

성능이 뛰어난 런타임 메모리 메트릭을 원하므로 오버로드를 기반으로 메모리 트래커를 작성했습니다 new & delete. 기본적으로 힙에서 할당을 수행하고 조각화, 크기, 시간, 숫자, 콜 스택 (callstack) 등과 같은 모든 것을 분석합니다. 그러나 치명적인 결함이 두 개 있습니다. 다른 DLL에 할당 된 메모리를 추적 할 수 없으며 개체 소유권 DLL로 전달되거나 그 반대로 충돌이 발생합니다. 작은 결함 : 사용자가 new 대신 malloc을 사용하면 문제가 발생하지 않습니다. 또는 사용자가 new/delete으로 정의 된 클래스를 만드는 경우.어떻게 DLL 경계를 넘어 메모리를 추적 할 수 있습니까

어떻게 이러한 결함을 제거 할 수 있습니까? new/delete을 오버로드하여이 문제를 근본적으로 잘못 수행해야한다고 생각합니다. 더 좋은 방법이 있습니까?

답변

4

이것을 구현하는 올바른 방법은 고유 프로세스에서 실행되는 별도 도구와 우회 경로를 사용하는 것입니다. 절차는 대략 다음과 같습니다.

  1. 원격 프로세스에서 메모리 할당을 만듭니다.
  2. dll을로드하는 작은 로더 코드를 추가하십시오.
  3. 로더를 실행할 API 인 CreateRemoteThread을 호출하십시오.
  4. 로드 된 dll 내부에서 alloc/dealloc 기능에 대한 detours (hooks, interceptors)를 설정합니다.
  5. 통화를 처리하고 활동을 추적합니다.

이 방법으로 도구를 구현하는 경우 메모리 할당 루틴이 호출되는 DLL 또는 직접 실행하는 것이 중요하지 않습니다. 또한 어떤 프로세스에서든 활동을 추적 할 수 있으며 반드시 자신이 편집 한 것은 아닙니다.

MS Windows는 원격 프로세스의 가상 주소 공간 내용을 확인할 수 있습니다. 다음과 같은 히스토그램이 방법으로 수집 된 가상 주소 공간의 사용을 요약 할 수 있습니다 :

enter image description here

을 당신이 당신의 대상 프로세스에 존재하는 어떤 크기의 얼마나 많은 가상 할당을 볼 수있는이 사진에서.

enter image description here

상기 사진은 32 비트 devenv를 MSVC의 가상 주소 공간 사용의 개요를 나타낸다. 파란색 줄무늬는 emory, magenta 줄무늬의 위탁 된 조각을 의미합니다. 녹색은 주소 공간의 비어있는 부분입니다.

낮은 주소는 꽤 세분화 된 반면 중간 영역은 잘리는 것을 볼 수 있습니다. 높은 주소의 파란색 선 - 프로세스에로드되는 다양한 dll입니다.

+0

위대한 답변! +1 – jweyrich

0

당신은 new/deletemalloc/free에 의해 호출되는 일반적인 메모리 관리 루틴을 찾아 사람들을 차단해야한다. 결국 일반적으로 malloc/free이지만 확인하십시오.

UNIX에서이 루틴을 다시 구현 한 라이브러리에는 LD_PRELOAD을 사용합니다. Windows에서는 조금 해킹해야하지만, this link은 프로세스에 대한 좋은 설명을주는 것처럼 보입니다. 기본적으로 Detours from Microsoft Research을 사용하는 것이 좋습니다.

0

모듈간에 객체 소유권을 넘기는 것은 근본적으로 결함이 있습니다. 그것은 사용자 정의 할당으로 나타났다, 또한 실패합니다 다른 경우의 많음이있다 : 정적 런타임 라이브러리를 연결하는 서로 다른 공급 업체

  • 에서
  • 혼합 컴파일러를

    • 컴파일러 업그레이드 및 재 컴파일 일부 DLL은

    몇 가지 예를 들자면 다음과 같습니다. 할당 한 동일한 모듈의 모든 객체를 해제하십시오 (종종 삭제 기능을 내 보냅니다 (예 : IUnknown::Release())).

  • 관련 문제