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


Определение того, почему драйвер UMDF потребляет чрезмерное количество памяти

Предупреждение

UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.

Архивные примеры UMDF 1 можно найти в Windows 11 версии 22H2 — майское обновление образцов драйверов 2022 года.

Дополнительные сведения см. в разделе Начало работы сUMDF.

В этом разделе описывается, как использовать расширения отладчика Wudfext.dll в сочетании с драйвером User-Mode Driver Framework (UMDF) версии 1, чтобы определить, почему драйвер UMDF потребляет чрезмерное количество памяти.

Начиная с UMDF версии 2, рекомендуется использовать расширения отладчика Wdfkd.dll. Дополнительные сведения см. в расширениях платформы Windows Driver Framework () (Wdfkd.dll).

Чтобы изучить использование памяти, выполните следующие действия.

  1. Просмотр выдающегося объекта в дереве объектов с помощью расширения отладчика UMDF !wudfext.wudfobject.

    Расширение !wudfext.wudfobject отображает сведения о объекте WDF, включая его родительские и дочерние отношения. Если установить бит 0 параметра флагов в значение 1 (0x01), !wudfext.wudfobject выполняет рекурсивный дамп дерева объектов, начинающегося с переданного объекта. Чтобы просмотреть полное дерево объектов, используйте следующую команду:

    !wudfext.wudfobject <IWDFDriver*> 1

  2. Определите, отображаются ли более выдающиеся объекты, чем ожидалось.

    Драйвер может в конечном итоге вызвать утечку этих объектов (подробнее об утечке объектов WDF см. в разделе Определение того,утекут ли объекты фреймворка).

    Эти объекты могут находиться в дереве объектов и поэтому в конечном итоге будут освобождены. Тем не менее, они накапливаются ненужно. Для этих объектов может потребоваться следующее:

    • Исправления родительских объектов.
    • Явное удаление с помощью метода IWDFObject::DeleteWdfObject.