다음을 통해 공유


예제 9: 풀 메모리 누수 감지

다음 예제에서는 GFlags를 사용하여 레지스트리에서 시스템 전체 풀 태그 지정 사용 플래그를 설정합니다. 그런 다음 Windows 드라이버 키트의 도구인 PoolMon(poolmon.exe)을 사용하여 메모리 풀의 크기를 표시합니다.

PoolMon은 페이징된 메모리 풀 및 비페이지 메모리 풀의 바이트를 모니터링하고 풀 태그별로 정렬합니다. PoolMon을 주기적으로 실행하면 시간이 지남에 따라 지속적으로 확장되는 풀을 식별할 수 있습니다. 이 패턴은 종종 메모리 누수임을 나타냅니다.

참고 풀 태그 지정은 Windows Server 2003 이상 버전의 Windows에서 영구적으로 사용하도록 설정됩니다. 이러한 시스템에서는 전역 플래그 대화 상자의 풀 태그 지정 검사 사용 상자가 흐리게 표시되고 풀 태그 지정을 사용하거나 사용하지 않도록 설정하는 명령이 실패합니다. 풀 태그 지정을 사용하도록 설정하지 않으면 PoolMon이 실패하고 "쿼리 풀태그 실패 c0000002" 메시지가 표시됩니다.

풀 메모리 누수 감지

  1. Windows Server 2003 이전 버전의 모든 프로세스에 대해 풀 태그 지정을 사용하도록 설정하려면 레지스트리에서 시스템 전체 풀 태그 지정 사용 플래그를 설정합니다. 다음 명령줄에서는 플래그 약어 메서드를 사용하지만 16진수 값으로 플래그를 식별하거나 전역 플래그 대화 상자를 사용할 수 있습니다.

    gflags /r +ptg 
    
  2. 컴퓨터를 다시 시작하여 레지스트리를 효과적으로 변경합니다.

  3. 다음 명령을 사용하여 주기적으로 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
    

    할당에 대한 바이트 열의 값이 명백한 이유 없이 지속적으로 확장되는 경우 해당 풀에 메모리 누수가 있을 수 있습니다.

  4. 풀 태그 지정 사용 플래그를 지웁합니다.

    다음 명령줄에서는 플래그 약어 메서드를 사용하지만 16진수 값으로 플래그를 식별하거나 전역 플래그 대화 상자를 사용할 수 있습니다.

    gflags /r -ptg 
    
  5. 레지스트리를 효과적으로 변경하려면 Windows를 다시 시작합니다.

참고 추가 기호(>>)를 사용하여 PoolMon 출력을 로그 파일로 리디렉션합니다. 나중에 풀 크기 추세에 대한 로그 파일을 검사할 수 있습니다. 예:

poolmon.exe /b >> poolmon.log