다음을 통해 공유


PoolMon을 사용하여 커널 모드 메모리 누수 찾기

커널 모드 메모리 누수로 의심되는 경우 PoolMon 도구를 사용하여 누수와 연결된 풀 태그를 확인할 수 있습니다.

PoolMon (poolmon.exe) monitors pool memory usage by pool tag name. 이 도구는 WDK(Windows 드라이버 키트)에 포함되어 있습니다. For more information, see PoolMon.

GFlags 풀 설정

Some GFlags settings such as Special Pool, can affect how memory pools are used. For more information, see GFlags and Configuring Special Pool.

Use PoolMon

PoolMon 헤더는 페이징된 총 풀 바이트 및 비페이지 풀 바이트를 표시합니다. 각 풀 태그에 대한 풀 사용량이 열에 표시됩니다. 표시는 몇 초마다 자동으로 업데이트됩니다. For example:

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 

PoolMon에는 다양한 조건에 따라 출력을 정렬하는 명령 키가 있습니다. 데이터 정렬 방법을 변경하려면 특정 정렬 명령과 연결된 바로 가기 키를 선택합니다. 각 명령이 디스플레이에 영향을 미치는 데 몇 초 정도 걸립니다.

다음 표에서는 사용 가능한 정렬 명령을 나열합니다.

Command key Operation
P Limit the tags shown to nonpaged pool bytes (P), paged pool bytes (P, P), or both (Enter). Repeatedly selecting P cycles through the options.
B 최대 바이트 사용량을 기준으로 태그를 정렬합니다.
M 최대 바이트 할당별로 태그를 정렬합니다.
T 태그 이름을 기준으로 사전순으로 태그를 정렬합니다.
E 표시의 아래쪽에 페이징된 합계와 페이징하지 않은 합계를 표시합니다.
A 할당 크기별로 태그를 정렬합니다.
F 자유 작업별로 태그를 정렬합니다.
S 할당과 해제 간의 차이를 기준으로 태그를 정렬합니다.
Q Quit PoolMon.

PoolMon에서 드라이버 이름 표시

PoolMon /g 매개 변수를 사용하여 각 풀 태그를 할당하는 Windows 구성 요소 및 일반적으로 사용되는 드라이버의 이름을 표시할 수 있습니다. 특정 태그를 사용한 할당에서 문제가 발견되면 이 기능을 통해 잘못된 구성 요소 또는 드라이버를 식별할 수 있습니다.

The components and drivers are listed in the Mapped_Driver column, the right-most column in the display. The data for the Mapped_Driver column comes from the pooltag.txt file installed with the WDK.

The following command shows the use of the /g parameter to add the Mapped_Driver column:

poolmon /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

특정 풀 표시

매개 변수를 /i 사용하여 특정 문자열로 시작하는 풀 태그를 표시합니다.

The following command shows the use of the /i parameter to add the string Hid:

poolmon /iHid? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

표시는 몇 초마다 자동으로 업데이트됩니다. For example:

Memory:33473120K Avail:20055132K  PageFlts:     5   InRam Krnl:10444K P:1843072K
Commit:15035764K Limit:67027552K Peak:16677444K            Pool N:1023400K P:1955448K
System pool information

Tag    Type    Allocs         Frees        Diff   Bytes            Per Alloc Mapped_Driver

HidC   Paged    1667 (  0)    1659 (  0)     8      896 (     0)   112 [hidclass.sys - HID Class d 
HidC   Nonp    17375 (  0)   17256 (  0)   119    19808 (     0)   166 [hidclass.sys - HID Class d 
HidP   Nonp     1014 (  0)     998 (  0)    16     6704 (     0)   419 [hidparse.sys - HID Parser]

PoolMon 유틸리티를 사용하여 메모리 누수 찾기

다음 단계에서는 PoolMon 유틸리티를 사용하여 메모리 누수 문제를 찾는 한 가지 방법을 보여 줍니다.

  1. Start PoolMon.

  2. 확인할 풀 유형을 식별합니다.

    • Nonpaged pool: If you know the leak occurs in a nonpaged pool, select P once.

    • Paged pool: If you know the leak occurs in a paged pool, select P, P.

    • Both pools: If you're unsure about the leak source, select Enter, so both pool types are included. Don't select P.

  3. Select B to sort the display by Maximum byte use.

  4. 테스트를 시작합니다.

    • 스크린샷을 찍는 등 화면에서 출력을 복사하고 저장합니다.

    • 30분마다 현재 출력을 복사하여 새 파일에 저장합니다.

  5. 여러 출력 파일이 있으면 데이터 차이를 비교합니다. 증가하는 태그의 바이트를 확인합니다.

  6. 테스트를 중지하고 몇 시간을 기다립니다. 이 시간에 해제된 태그의 양을 확인합니다.

일반적으로 애플리케이션이 안정적인 실행 상태에 도달하면 메모리와 사용 가능한 메모리를 동일한 속도로 할당합니다. 메모리를 해제하는 것보다 더 빠르게 할당하는 경우 메모리 사용은 시간이 지남에 따라 증가합니다. 이 동작은 종종 메모리 누수입니다.

누수 해결

누수와 관련된 풀 태그를 식별하면 누수에 대한 모든 필요한 정보가 있을 수 있습니다. 누수를 유발하는 할당 루틴의 특정 인스턴스를 확인해야 하는 경우 커널 디버거를 사용하여 커널 모드 메모리 누수를 찾습니다.