Поделиться через


Пример 9. Обнаружение утечки памяти пула

В следующем примере GFlags используется для задания флага включения тегирования пула на уровне системы в реестре. Затем он использует PoolMon (poolmon.exe), средство в комплекте драйверов Windows для отображения размера пулов памяти.

PoolMon отслеживает байты в страницах и непагированных пулах памяти и сортирует их по тегу пула. Периодически выполняя poolMon, можно определить пулы, которые постоянно расширяются с течением времени. Этот шаблон часто указывает на утечку памяти.

Заметка Теги пула постоянно включены в Windows Server 2003 и более поздних версиях Windows. В этих системах флажок "Включить тегирование пула" в диалоговом окне "Глобальные флаги" неактивен, а команды для включения или отключения тегирования пула завершаются ошибкой. Если тегирование пула не включено, PoolMon завершается ошибкой и отображает следующее сообщение: "Сбой запроса тэгов пула c0000002".

Чтобы обнаружить утечку памяти пула

  1. Чтобы включить теги пула для всех процессов в версиях Windows, предшествующих Windows Server 2003, установите системный флаг Enable pool tagging в реестре. В следующей командной строке используется метод сокращения флага, но флаг можно определить по шестнадцатеричным значениям или использовать диалоговое окно "Глобальные флаги ":

    gflags /r +ptg 
    
  2. Перезапустите компьютер, чтобы изменить реестр.

  3. Периодически запустите poolMon с помощью следующей команды. В этой команде параметр /b сортирует пулы в порядке убывания размера.

    poolmon /b 
    

    В ответ ПулМон отображает выделения из пулов памяти в порядке убывания размера, включая количество операций выделения и бесплатных операций, а также объем памяти, оставшейся в пуле (в столбце байтов).

    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. Снимите флаг включения тегирования пула.

    В следующей командной строке используется метод сокращения флага, но флаг можно определить по шестнадцатеричным значениям или использовать диалоговое окно "Глобальные флаги ":

    gflags /r -ptg 
    
  5. Перезапустите Windows, чтобы изменить реестр.

Заметка Используйте символ добавления (>>) для перенаправления выходных данных PoolMon в файл журнала. Позже вы можете просмотреть файл журнала, чтобы изучить тенденции в размере пула. Рассмотрим пример.

poolmon.exe /b >> poolmon.log