2018년 3월 20일 화요일

UMDH 사용하기 (release 파일에서 memory leaks 검출)

2010. 8. 3. 12:51

다음의 내용은 Quad Dimensions에서 Debugging 교육 자료로 만든 내용입니다.
본부장 
가져 가실때는 이 정보 남겨 주시는것이 예의 겠지요 ^^
  
UMDH 사용하기 (release 파일에서 memory leaks 검출)

l  User-Mode Dump Heap tool
l  UDMH MS쪽 문서는 http://support.microsoft.com/kb/268343/ko , http://support.microsoft.com/kb/268343 를 보면 됩니다.
l  유사한 툴로 LeakDiag라는 것도 있음http://blog.koolkuri.com/DK/123 참고

Windbg 패키지를 설치하면 umdh.exe 라는 콘솔 프로그램이 설치되는데 , 이 프로그램은 user-mode heap 정보를 덤프 시켜주는 프로그램이다.

사용법은 아래와 같다
umdh -p:ProcessID > 파일명.log
또는
umdh -p:ProcessID -f:파일명.log

이 덤프 정보를 이용해서 프로그램이 처음 뜰 때 dump를 뜨고 , 종료되기 바로 전에 덤프를 떠서 두 개 파일을 자동 비교 시키면 메모리 누수를 찾을 수 있게 된다.
자동 비교시키는 방법은 아래와 같다.
UMDH 실행될때덤프.log 종료되기직전덤프.log > 비교파일.txt

위 프로그램 소스를 예를 든다면 아래와 같이 코드를 변경한다.
void vldLeakTest()
{
    char * p = NULL;

printf("start dump");
    getchar();  

    p = new char [10];
    sprintf(p,"%s","test");

    printf("end dump");
}
첫 번째 ‘start dump’가 떳을 때 작업관리자(task manager)를 보고 pid를 알아 낸다.
그 다음 아래와 같이 덤프를 남긴다.
umdh -p:PID > d1.log

그 뒤에 두번째 ‘end dump’ 메시지가 뜨면 아래와 같이 덤프를 남긴다.
umdh -p:PID > d2.log

그리고 최종적으로 아래와 같이 비교 파일을 만든다
UMDH –d d1.log d2.log > comp.txt
-d : 10진수로 데이터크기를 표시하라는 지시 )

아래는 실행 예를 보여주는 것이다.
<v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f><o:lock aspectratio="t" v:ext="edit"></o:lock>

결과물인 comp.txt 파일의 제일 아래쪽으로 보면 아래와 같은 내용이 있다.

+      10 (   4714 -   4704)      5 allocs  BackTrace206
+       1 (      5 -      4)         BackTrace206     allocations

ntdll!RtlAllocateHeapSlowly+00000041
ntdll!RtlAllocateHeap+00000E9F
Timetest!_heap_alloc+00000044 (f:\vs70builds\3077\vc\crtbld\crt\src\malloc.c, 211)
kernel32!BaseProcessStart+00000023

Total increase ==     10 requested +     30 overhead =     40

위 내용을 보면 10 바이트가 할당 된 것이 남아 있는 것을 알 수 있다.

댓글 없음:

댓글 쓰기