Измерение использования памяти драйверами устройств в Windows - PullRequest
9 голосов
/ 28 декабря 2008

Как определить, сколько памяти занимает каждый драйвер устройства? Я предполагаю, что это можно сделать с помощью некоторого Win32 или .NET API, но я просто не смог определить, какой именно.

Ответы [ 2 ]

12 голосов
/ 08 января 2009

Windows отслеживает использование памяти драйвером устройства с помощью тегов пула. Если вы знаете, какой тег пула передает рассматриваемый драйвер на ExAllocatePoolWithTag, то вы можете отслеживать использование его памяти с помощью таких инструментов, как poolmon (из комплекта драйверов Windows), PoolTag (из OSR) или WinDbg (или KD) (из средств отладки для Windows).

Обратите внимание, что драйверы устройств могут вызывать API-интерфейсы ядра, которые косвенно выделяют память. Например, вызов IoAllocateMdl приведет к тому, что диспетчер ввода-вывода Windows выделит память для списка дескрипторов памяти, используя другой тег пула, назначенный диспетчером ввода-вывода Windows. Из-за этого все распределения, выполняемые от имени нескольких драйверов устройств, могут использовать один и тот же тег пула.

Если вы пытаетесь определить, какой драйвер выполняет утечку памяти, используйте poolmon / PoolTag / WinDbg / KD, чтобы определить тег (ы) пула, которые просочились. Затем подключите к системе отладчик ядра (WinDbg или KD) и установите переменную nt!poolhittag в теге leaky pool. В следующий раз, когда ExAllocatePoolWithTag будет вызван для выделения памяти с помощью этого тега пула, система перейдет в отладчик ядра, а затем вы можете посмотреть на стек вызовов, чтобы выяснить, какой драйвер выполняет выделение. Этот процесс более подробно описан в Использование отладчика ядра для поиска утечки памяти в режиме ядра .

1 голос
/ 28 декабря 2008

Я знаю, что это нетривиально. Вот некоторые отправные точки для тесно связанных вопросов:

Вы можете получить (вероятно, неудовлетворительный) запуск, используя VirtualQueryEx для определения памяти, используемой PE-файлами, кучами и т. Д. Вот одна из программ, которая предоставляет Карта виртуальной памяти Посмотреть. Это должно соответствовать размеру изображения драйвера устройства.

Большая сложность заключается в определении того, как пометить память, которая динамически выделяется кодом, который ее выделяет. Лучше всего использовать что-то вроде обхода для отслеживания распределения динамической памяти по мере их создания и обхода стека для определения инициатора. Наконец, тот факт, что вы хотите сделать это для драйверов устройств, делает еще один шаг вперед. Я сомневаюсь, что обходные пути могут использоваться для драйверов устройств (хотя я точно не знаю). Я знаю, что обход стека из драйвера устройства весьма нетривиален.

Вы также можете получить нужные данные из ProcExp в SysInternals suite . Запустите его. Перейдите в «Система», перейдите в «Показать / показать нижнюю панель», включите Dll. Затем щелкните правой кнопкой мыши заголовки столбцов и добавьте их для рабочего набора, например. «WS Total». Я не уверен, что это делает, чтобы правильно пометить их память. На моем компьютере он отображает размер отображаемых драйверов устройств, но просто имеет 0 КБ в столбцах «Рабочий набор». Я считаю отсутствие ответа от procxp разумным доказательством того, что решение этой проблемы не будет быстрым.

Удачи.

...