예제 9: 풀 메모리 누수 감지
다음 예제에서는 GFlags를 사용하여 레지스트리에서 시스템 전체 풀 태그 지정 사용 플래그를 설정합니다. 그런 다음 Windows 드라이버 키트의 도구인 PoolMon(poolmon.exe)을 사용하여 메모리 풀의 크기를 표시합니다.
PoolMon은 페이징된 메모리 풀 및 비페이지 메모리 풀의 바이트를 모니터링하고 풀 태그별로 정렬합니다. PoolMon을 주기적으로 실행하면 시간이 지남에 따라 지속적으로 확장되는 풀을 식별할 수 있습니다. 이 패턴은 종종 메모리 누수임을 나타냅니다.
참고 풀 태그 지정은 Windows Server 2003 이상 버전의 Windows에서 영구적으로 사용하도록 설정됩니다. 이러한 시스템에서는 전역 플래그 대화 상자의 풀 태그 지정 검사 사용 상자가 흐리게 표시되고 풀 태그 지정을 사용하거나 사용하지 않도록 설정하는 명령이 실패합니다. 풀 태그 지정을 사용하도록 설정하지 않으면 PoolMon이 실패하고 "쿼리 풀태그 실패 c0000002" 메시지가 표시됩니다.
풀 메모리 누수 감지
Windows Server 2003 이전 버전의 모든 프로세스에 대해 풀 태그 지정을 사용하도록 설정하려면 레지스트리에서 시스템 전체 풀 태그 지정 사용 플래그를 설정합니다. 다음 명령줄에서는 플래그 약어 메서드를 사용하지만 16진수 값으로 플래그를 식별하거나 전역 플래그 대화 상자를 사용할 수 있습니다.
gflags /r +ptg
컴퓨터를 다시 시작하여 레지스트리를 효과적으로 변경합니다.
다음 명령을 사용하여 주기적으로 PoolMon을 실행합니다. 이 명령에서 /b 매개 변수는 풀을 내림차순으로 정렬합니다.
poolmon /b
이에 대한 응답으로 PoolMon은 할당 작업 수와 사용 가능한 작업 수, 풀에 남아 있는 메모리 양(바이트 열)을 포함하여 메모리 풀의 할당을 내림차순으로 표시합니다.
Memory: 16224K Avail: 4564K PageFlts: 31 InRam Krnl: 684K P: 680K Commit: 24140K Limit: 24952K Peak: 24932K Pool N: 744K P: 2180K Tag Type Allocs Frees Diff Bytes Per Alloc ----------------------------------------------------------------------- CM Paged 1283 ( 0) 1002 ( 0) 281 1377312 ( 0) 4901 Strg Paged 10385 ( 10) 6658 ( 4) 3727 317952 ( 512) 85 Fat Paged 6662 ( 8) 4971 ( 6) 1691 174560 ( 128) 103 MmSt Paged 614 ( 0) 441 ( 0) 173 83456 ( 0) 482
할당에 대한 바이트 열의 값이 명백한 이유 없이 지속적으로 확장되는 경우 해당 풀에 메모리 누수가 있을 수 있습니다.
풀 태그 지정 사용 플래그를 지웁합니다.
다음 명령줄에서는 플래그 약어 메서드를 사용하지만 16진수 값으로 플래그를 식별하거나 전역 플래그 대화 상자를 사용할 수 있습니다.
gflags /r -ptg
레지스트리를 효과적으로 변경하려면 Windows를 다시 시작합니다.
참고 추가 기호(>>)를 사용하여 PoolMon 출력을 로그 파일로 리디렉션합니다. 나중에 풀 크기 추세에 대한 로그 파일을 검사할 수 있습니다. 예:
poolmon.exe /b >> poolmon.log