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


Определение причин, по которой драйвер 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 (Wdfkd.dll).

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

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

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

    !wudfext.wudfobject <IWDFDriver*> 1

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

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

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

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