문제

C ++ 프로그램에서 메모리 할당을 추적하는 방법을 찾고 있습니다. 그래요 ~ 아니다 대부분의 도구가 찾으려고하는 것처럼 보이지만 응용 프로그램에 대한 메모리 사용 프로필을 만드는 메모리 누출에 관심이 있습니다. 이상적인 출력은 기능 이름의 큰 목록과 시간이 지남에 따라 최대 할당 된 바이트 수가되거나 시간이 지남에 따라 힙의 그래픽 표현입니다. 수평 축은 시간, 수직 축 힙 공간입니다. 모든 함수는 할당 된 힙 바이트에 따라 자체 색상을 얻고 선을 그립니다. 할당 된 객체 유형을 식별하기위한 보너스 포인트.

아이디어는 메모리 병목 현상을 찾는 것입니다. 어떤 기능/스레드가 가장 많은 메모리를 소비하는지 시각화하고 추가 최적화를 목표로해야합니다.

나는 Purify, Boundschecker 및 AQTime을 간단히 살펴 보았지만 그들은 내가 뒤 따르는 것처럼 보이지 않는 것 같습니다. Valgrind는 적합한 것처럼 보이지만 나는 창문에 있습니다. MEMTRACK 유망한 것처럼 보이지만 소스 코드를 크게 변경해야합니다.

내 Google 기술이 저를 실패했을 것입니다. 왜냐하면 그렇게 드문 요청이 아닌 것 같습니다. 이와 같은 도구를 작성하는 데 필요한 모든 정보는 프로그램의 디버그 기호와 런타임 API 호출에서 쉽게 사용할 수 있어야합니까?

도움이 되었습니까?

해결책 4

게임 개발을위한 PC의 메모리 사용량 모니터링 내가 찾고 있던 것에 대한 거의 완벽한 예가 포함되어 있습니다. 실행하는 데 시간이 걸렸지 만 기사의 저자는 매우 도움이되었습니다. 여기에서 도구의 소스 코드를 찾을 수 있습니다. Memtracer.

나는 또한 Sweng (소프트웨어 엔지니어링 메일 링리스트). 스레드는 [Sweng-Gamedev] C ++ 메모리 사용 모니터링?"라고합니다.

다른 팁

Valgrind와 그 도구를 사용하십시오. 예제 출력 (IT의 일부) :

99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->49.74% (10,000B) 0x804841A: main (example.c:20)
| 
->39.79% (8,000B) 0x80483C2: g (example.c:5)
| ->19.90% (4,000B) 0x80483E2: f (example.c:11)
| | ->19.90% (4,000B) 0x8048431: main (example.c:23)
| |   
| ->19.90% (4,000B) 0x8048436: main (example.c:25)
|   
->09.95% (2,000B) 0x80483DA: f (example.c:10)
  ->09.95% (2,000B) 0x8048431: main (example.c:23)

따라서 자세한 정보를 얻을 수 있습니다.

  • 메모리를 할당 한 사람 (함수 : g (), f () 및 main () 위의 예제); 또한 기능 할당 기능으로 이어지는 완전한 백 트레이스를 얻을 수 있습니다.
  • 메모리가 진행되는 데이터 구조 (위의 예에서는 데이터 구조 없음)
  • 그 일이 일어 났을 때,
  • 할당 된 모든 메모리의 몇 퍼센트 (G : 39.7%, F : 9.95%, 메인 : 49.7%).

여기에 있습니다 대규모 매뉴얼

힙 할당 및 스택 할당 (기본적으로 꺼짐)을 추적 할 수 있습니다.

추신. 방금 당신이 창문에 있다는 것을 읽었습니다. 그래도 가능한 도구에서 얻을 수있는 내용을 보여주기 때문에 답을 남길 것입니다.

Microsoft는 잘 문서화 된 메모리 추적 기능을 가지고 있습니다. 그러나 어떤 이유로 든 그들은 개발자 커뮤니티에서 실제로 잘 알려져 있지 않습니다. 이들은 CRT 디버그 기능입니다. 좋은 출발점이 될 것입니다 CRT 디버그 힙 함수.

자세한 내용은 다음 링크를 확인하십시오

  1. 힙 상태보고 기능
  2. 힙 할당 요청 추적. 아마도 이것은 당신이 찾고있는 기능 일 것입니다.

일반적인 C ++ 메모리 추적기의 경우 다음을 과부하해야합니다.

global operator new
global operator new []
global operator delete
global operator delete []
any class allocators
any in-place allocators

까다로운 비트는 유용한 정보를 얻고 있으며, 과부하 된 연산자는 할당자를위한 크기 정보와 삭제를위한 메모리 포인터 만 있습니다. 한 가지 대답은 매크로를 사용하는 것입니다. 알아요. 끔찍한. 예제 - 모든 소스 파일에서 포함 된 헤더에 배치 :

#undef new

void *operator new (size_t size, char *file, int line, char *function);
// other operators

#define new new (__FILE__, __LINE__, __FUNCTION__)

다음과 같이 소스 파일을 만듭니다.

void *operator new (size_t size, char *file, int line, char *function)
{
  // add tracking code here...
  return malloc (size);
}

위는 클래스 범위에 새로 정의 된 연산자가없는 경우에만 작동합니다. 클래스 범위에 일부가있는 경우 다음을 수행하십시오.

#define NEW new (__FILE__, __LINE__, __FUNCTION__)

'새 유형'을 '새 유형'으로 바꾸지 만 많은 코드를 잠재적으로 변경해야합니다.

매크로이므로 메모리 추적기를 제거하는 것이 매우 간단합니다. 헤더는 다음과 같습니다.

#if defined ENABLED_MEMORY_TRACKER
#undef new

void *operator new (size_t size, char *file, int line, char *function);
// other operators

#define NEW new (__FILE__, __LINE__, __FUNCTION__)
#else
#define NEW new
#endif

구현 파일 :

#if defined ENABLED_MEMORY_TRACKER
void *operator new (size_t size, char *file, int line, char *function)
{
  // add tracking code here...
  return malloc (size);
}
endif

이것도 시도하십시오 : 메모리 유효성 검사기

Mac OS X에서는 코드 프로파일 링 도구 상어를 사용하여 IIRC를 수행 할 수 있습니다.

Xcode에서는 계측기를 사용하여 할당, VM 사용법 및 기타 여러 매개 변수를 추적 할 수 있습니다. iOS 개발자들 사이에서 주로 인기가 있지만 시도해 볼 가치가 있습니다.

"시간이 지남에 따라 힙의 그래픽 표현" - 당신이 찾고있는 것과 가까운 인텔 (R) 단일 이벤트 API, 세부 사항은 찾을 수 있습니다 이 기사 (여기에 넣는 것은 다소 큽니다). Memory block allocations over time

블록 크기당 할당의 타임 라인을 보여주고 전체 사진을 더 잘 이해하기 위해 코드에 추가 표시를 추가 할 수 있습니다.

Visual Studio IDE에는 2015 년 이후의 힙 프로파일 링 지원이 내장되어 있으며, 이는 아마도 가장 쉽게 시작할 수 있습니다. 시간이 지남에 따라 힙 사용의 그래픽보기가 있으며 기능/방법별로 할당을 추적 할 수 있습니다.

heap profiling

CRT에는 또한 디버그 및 프로파일 지원이 있으며, 이는보다 상세하고 낮은 수준입니다. 데이터를 추적하고 다른 도구를 사용하여 결과를 플로팅 할 수 있습니다.

특히,보십시오 _CrtMemCheckpoint 및 관련 기능.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top