UMDH를 이용한 메모리릭 탐지

마이크로소프트에서 많은 흥미로운 툴들이 나오는데, 그 중 하나가 메모리릭(Memory Leak)을 탐지하기 위한 UMDH라는 툴입니다. 이미 윈디버거로 대표되는 “Debugging Tools for Windows패키지 안에 포함되어 있습니다.

사실 예전에는 이 툴이 별로 환영을 받지 못했는데, MSVC에서 FPO를 통해서 프로그램 바이너리를 최적화 시키는 것이 디폴트여서 대부분의 프로그램들이 FPO가 내장 된 채로 배포되는 경우가 많았기 때문입니다. 심지어는 마이크로소프트의 바이너리들도 FPO적용된채 배포되었습니다. FPO프레임 포인터를 사용하지 않고 컴파일 과정에서 남는 register를 하나 찾아서 그 레지스터를 사용해서 로컬 변수 등을 사용하는 컴파일 최적화 과정 중의 하나입니다.

그런데 이 FPO라는 놈이 디버깅시에는 콜스택 추적을 끊어 버리는 효과가 있어서 콜 스택 중에 FPO가 들어간 모듈이 하나라도 있다면 콜스택이 잘린 상태로 볼 수 밖에 없습니다. 그런 경우에는 디버거가 휴리스틱하게 잡아주기도 하고, 사람이 직접 메모리를 직접 보면서 대충 추측하는 수 밖에 없지요.

어쨌든 Windows XP 이후의 버전에서는 시스템 DLL들은 모두 FPO를 없앤채로 나오니 UMDH와 같은 툴들이 꽤 효과를 발휘하고 있습니다.

용예)

set _NT_SYMBOL_PATH=SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\myapplicationssymbols

C:\Program Files\Debugging Tools for Windows (x86)>gflags -i test.exe +ust

Current Registry Settings for test.exe executable are: 00001000

ust – Create user mode stack trace database

umdh -p:124 -f:test01.log

umdh -p:124 -f:test02.log

umdh -d test01.log test02.log

– 520 ( 13520 – 14040) 26 allocs BackTrace363

– 1 ( 26 – 27) BackTrace363 allocations

7C8531E4 : ntdll!RtlAllocateHeapSlowly+00000041

7C83D97A : ntdll!RtlAllocateHeap+00000E9F

77E655E3 : kernel32!FlsSetValue+00000050

77BAF5D2 : msvcrt!__CRTDLL_INIT+000001AC

7C81A352 : ntdll!LdrpCallInitRoutine+00000014

7C82ED97 : ntdll!LdrpInitializeThread+0000010D

7C82EC9F : ntdll!_LdrpInitialize+0000016F

7C8284C5 : ntdll!KiUserApcDispatcher+00000025

Leave a Reply