3

메모리 사용량이 많은 혼합 모드 응용 프로그램 (관리되는 및 기본)이 있습니다. 나는 이미 대부분의 메모리가 원시 코드에 의해 할당된다는 것을 알았다. 나는 메모리 누수에 대해 이야기하는 것이 아니라, 프로그램이 시작된 후 매우 일찍 발생하는 높은 메모리 소비에 대해 이야기하고 있으며, 비교적 안정적이다.어떤 C/C++ 개체가 대부분의 메모리를 사용하는지 확인하는 방법

어떤 C/C++ 개체가 가장 많은 메모리를 사용하는지 보여주는 도구가 있습니까? 이미 DebugDiag 1.1 및 SoftwareVerify의 메모리 유효성 검사기를 사용해 보았지만 두 도구 모두 C/C++ 개체를 식별하는 데 충분한 정보를 제공하지 않습니다. 물론 이것에 대한

감사

프랭크

답변

2

AQTime's memory profiler 작품. 그것은 내가 혼합 모드 어셈블리를 지원하는 것을 포함하여 동일한 프로파일 러를 사용하여 네이티브 코드와 관리 코드를 모두 처리하는 몇 가지 프로파일 러 중 하나입니다.

+0

AQtime을 시도했지만 혼합 모드 응용 프로그램에 문제가있는 것 같습니다. 나는 여러 가지 다른 프로그램 (간단한 "Hello, world"유형의 프로그램 포함)으로 시도했지만 AQtime이 액세스하면 충돌합니다. 제조업체의 지원 –

+0

Hrm에 연락했습니다. 나를 위해 잘 작동합니다. 나는 x86 타겟 혼합 모드 응용 프로그램으로 만 시도해 보았습니다. –

2

"하드 코어"접근 방식을 제안 할 수 있습니까?

WinDbg 's! heap 명령은 기본 힙에 대한 많은 중요한 정보를 나타낼 수 있습니다. 다음 단계를 수행하여 을 시작하십시오 :

A. GFlags를 실행하고 이미지 파일 탭으로 이동하여 프로세스 이름을 입력하고 탭을 누르십시오.

B. "페이지 힙 사용"및 "사용자 모드 스택 추적 데이터베이스 작성"을 누르고 확인을 누릅니다.

C. 프로세스를 시작하십시오.

위의 단계를 수행하면 프로세스에 대한 메모리 할당 정보를 수집하도록 Windows에 지시합니다. 나중에이 정보를 사용하겠습니다.

중요 :이 정보를 수집하면 응용 프로그램이 더 많은 메모리를 사용하게되고 속도가 느려질 수 있습니다. 윈도우는 여러분이 프로세스를 실행할 때마다이 정보를 계속 수집 할 것이며, GFlags를 시작하고 선택 사항을 제거함으로써 달리 말할 것입니다.

응용 프로그램에 WinDbg를 연결하고 올바른 기호를 설정하십시오. 자신의 기호 옆에 Microsoft 기호가 있어야합니다. .symfix 명령을 사용한 다음 .reload/f를 사용하여 WinDbg가 Microsoft의 기호 서버에서 올바른 기호를 다운로드하도록하십시오 (몇 분이 소요될 수 있음). ! 모든 기호는 다음과 같이 설정 한 후

는 :

A. 힙 -stat을 -

B. 하나의 힙 검사를 선택 모든 프로세스의 힙의 사용 여름을 볼 수 있습니다. 커다란 객체를 찾고 있다면 커밋 된 바이트가 가장 높은 바이트가 좋은 후보가 될 것입니다.

C.! heap -stat -h "heap handle"- 힙에 대한 할당 통계를 볼 수 있습니다. 출력에서 각 할당 크기에 할당 된 블록 수를 확인할 수 있습니다.

D. 더 높은 할당 크기 중 하나를 선택하고! heap -flt s "size"를 사용하여 동일한 크기의 모든 힙 항목을 덤프하십시오.

E.! heap -p -a "UserPtr"은 (다른 정보와 함께) 할당 스택을 인쇄합니다. GFlags를 사용하여 "페이지 힙 사용"을 설정하지 않으면이 정보를 사용할 수 없습니다.

그게 전부입니다. 호출 스택의 정보를 사용하고 소스 코드를 보면 큰 개체를 식별 할 수 있습니다. 이미 설치 Windows 용 디버깅 도구 패키지가없는 경우

B.T.W는

, 당신은 here에서 다운로드 할 수 있습니다.

아마도이 방법은 예상 한대로 간단하지는 않지만 작동합니다. 재미있게 보내십시오.

+0

WinDbg는 프로세스 메모리에 대한 모든 진실을 말하지 않는 것 같습니다. 내 프로세스에는 Windows 작업 관리자에 따라 121 MB 커밋 된 메모리가 있습니다. "! heap -s"는 커밋 된 메모리가 33MB이고 "! heap -stat"은 커밋 된 메모리가 2.3MB라고 표시합니다. –