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


Моделирование низких ресурсов

Если параметр "Моделирование низких ресурсов" (называемый симуляция случайных низких ресурсов в Windows 8.1) активен, средство проверки драйверов намеренно вызывает сбои в случайных случаях выделения памяти драйвера, такое может произойти, если драйвер работал на компьютере с недостаточной памятью. Это проверяет способность драйвера правильно реагировать на низкую память и другие условия с низким уровнем ресурсов.

Тест моделирования низких ресурсов завершается ошибкой выделения памяти, запрашиваемых вызовами нескольких различных функций, включая ExAllocatePoolWithXXX, MmGetSystemAddressForMdlSafe, MmProbeAndLockPages, MmMapLockedPagesSpecifyCache и MmMapIoSpace.

Начиная с Windows Vista, тест с низким уровнем ресурсов также внедряет ошибки в IoAllocateIrp, IoAllocateMdl, IoAllocateWorkItem, IoAllocateErrorLogEntry, MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache, MmAllocatePagesForMdl и MmAllocatePagesForMdlEx. Кроме того, начиная с Windows Vista, если включена имитация низких ресурсов, вызовы к KeWaitForMultipleObjects или KeWaitForSingleObject с параметром alertabletrue могут возвращать STATUS_ALERTED при выполнении в контексте не привилегированных процессов. Это имитирует возможное оповещение о потоке, поступающее из другого потока в том же непривилегированном приложении.

Тест с низким уровнем ресурсов также внедряет ошибки в следующие функции GDI: EngAllocMem, EngAllocUserMem, EngCreateBitmap, EngCreateDeviceSurface, EngCreateDeviceBitmap, EngCreatePalette, EngCreateClip, EngCreatePath, EngCreateWnd, EngCreateDriverObj, BRUSHOBJ_pvAllocRbrush и CLIPOBJ_ppoGetPath.

В Windows 7 и более поздних версиях операционной системы Windows параметр "Моделирование низких ресурсов" поддерживает память, выделенную с помощью следующих API ядра:

Начиная с Windows 8.1, параметр "Моделирование низких ресурсов" также завершается сбоем выделения, запрошенных вызовами MmAllocateNodePagesForMdlEx. Кроме того, для некоторых функций средство проверки драйверов теперь заполняет выделенную память случайным шаблоном. Но только в ситуациях, когда функция возвращает неинициализированную память. К этим функциям относятся:

Пользовательские параметры для моделирования низких ресурсов

В Windows Vista и более поздних версиях Windows можно указать следующие настраиваемые параметры.

  • Вероятность того, что данное выделение завершится ошибкой. Значение по умолчанию — 6%.

  • Затронутые приложения . Этот параметр ограничивает сбои выделения памяти, внедряемые в указанные приложения. По умолчанию все выделения затрагиваются.

  • Затронутые теги пула . Этот параметр ограничивает внедренные ошибки выделениями с указанными тегами пула. По умолчанию все выделения затрагиваются.

  • Задержка (в минутах) прежде чем выделения будут признаны несостоявшимися. Эта задержка позволяет системе запуститься и стабилизироваться перед инъекцией неисправностей. Значение по умолчанию — восемь минут.

В операционных системах до Windows Vista эти параметры нельзя настроить. Операционная система использует значения по умолчанию.

Моделирование низких ресурсов без перезагрузки

Вы можете активировать моделирование низких ресурсов в Windows 2000 и более поздних версиях Windows, не перезагрузив компьютер с помощью параметра /volatile . Параметры эффективны немедленно, но теряются при завершении работы или перезапуске компьютера.

Кроме того, параметры моделирования низких ресурсов можно хранить в реестре, пропуская параметр /volatile . Эти параметры эффективны только при перезапуске компьютера, но они остаются эффективными, пока не измените их.

Активация этого параметра

Параметр "Моделирование низких ресурсов" можно активировать для одного или нескольких драйверов с помощью диспетчера проверки драйверов или командной строки Verifier.exe. Дополнительные сведения см. в разделе "Выбор параметров средства проверки драйвера".

  • В командной строке

    В командной строке параметр "Моделирование низких ресурсов" представлен битом 2 (0x4). Чтобы активировать моделирование низких ресурсов, используйте значение флагов 0x4 или добавьте 0x4 в значение флагов. Рассмотрим пример.

    verifier /flags 0x4 /driver MyDriver.sys
    

    Параметр будет активным после следующей загрузки.

    В Windows Vista и более поздних версиях Windows можно использовать параметр /faults или значение флагов 0x4 для активации моделирования низких ресурсов. Чтобы изменить параметры для моделирования низких ресурсов, необходимо использовать /faults. Рассмотрим пример.

    verifier /faults /driver MyDriver.sys
    

    В Windows 2000 и более поздних версиях Windows можно также активировать и деактивировать моделирование низких ресурсов без перезагрузки компьютера, добавив в команду параметр /volatile . Рассмотрим пример.

    verifier /volatile /flags 0x4 /adddriver MyDriver.sys
    

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

    В Windows Vista можно использовать параметр /faults для представления моделирования низких ресурсов с параметром /volatile , чтобы представить параметр, действующий без перезагрузки. Будет отображено изменение параметра. Рассмотрим пример.

    0>  verifier /volatile /faults /adddriver MyDriver.sys
    New Low Resources Simulation options:
    
    - Use default fault injection probability.
    - Allocations using any pool tag can be failed.
    - Simulate low resources conditions in any application.
    
    The new settings are in effect until you restart this computer
    or change them again.
    
  • Использование диспетчера проверки драйверов

    1. Запустите диспетчер проверки драйверов. В окне командной строки введите средство проверки .
    2. Выберите "Создать настраиваемые параметры" (для разработчиков кода) и нажмите кнопку "Далее".
    3. Выберите отдельные параметры из полного списка.
    4. Выберите имитацию низких ресурсов.

Настройка параметров (Windows Vista и более поздних версий)

Начиная с Windows Vista можно изменить параметры по умолчанию для свойств тегов задержки, вероятности, приложений и пула для параметра "Моделирование низких ресурсов". Эти параметры можно изменить с помощью диспетчера проверки драйверов или командной строки Verifier.exe. Дополнительные сведения см. в разделе "Выбор параметров средства проверки драйвера".

В командной строке синтаксис этих параметров выглядит следующим образом:

средство проверки [/volatile] /faults[Probability|PoolTags|Applications|DelayMins][/driver|DriverList]

Заметка Параметры пользовательских параметров должны отображаться в указанном порядке. Если не указано значение, введите кавычки, чтобы сохранить его место.

Подпараметры

  • /Ошибки

    Включает параметр "Моделирование низких ресурсов" в средстве проверки драйверов. (Нельзя использовать флаги /flags 0x4 с настраиваемыми подпараметрами параметров.)

  • Вероятность

    Указывает вероятность того, что средство проверки драйверов вызовет сбой для заданного выделения. Введите число (в десятичном или шестнадцатеричном формате), чтобы указать вероятность в 10 000, что средство проверки драйверов не сможет выделить память. Значение по умолчанию, 600, означает 600/10000 или 6%.

  • PoolTags

    Ограничивает количество назначений, которые Driver Verifier может отклонить, ограничив это теми, что используют указанные теги пула. Можно использовать подстановочный знак (*) для представления нескольких тегов пула. Чтобы вывести список нескольких тегов пула, разделите теги пробелами. По умолчанию любое выделение ресурсов может завершиться ошибкой.

  • Приложения

    Ограничивает выделение, которое средство проверки драйверов может не выделять для указанной программы. Введите имя исполняемого файла. Чтобы перечислить программы, разделите имена программ пробелами. По умолчанию все выделения могут завершиться ошибкой.

  • DelayMins

    Указывает количество минут после загрузки, в течение которого средство проверки драйверов намеренно не завершает выделение. Эта задержка позволяет драйверам загружать и стабилизировать систему до начала теста. Введите число (в десятичном или шестнадцатеричном формате). Значение по умолчанию — 8 (минуты).

Например, следующая команда включает моделирование низких ресурсов с вероятностью 10% (1000/10000) и задержку на пять минут для тегов пула, Tag1 и Fred, а также приложения, Notepad.exe.

verifier /faults 1000 "Tag1 Fred" Notepad.exe 5

Следующая команда включает моделирование низких ресурсов со значениями по умолчанию, за исключением того, что она расширяет задержку до 10 минут.

verifier /faults "" "" "" 0xa

Использование диспетчера проверки драйверов

  1. Запустите диспетчер проверки драйверов. В окне командной строки введите средство проверки .

  2. Выберите "Создать настраиваемые параметры" (для разработчиков кода) и нажмите кнопку "Далее".

  3. Выберите отдельные параметры из полного списка.

  4. Нажмите кнопку " Симуляция с низкими ресурсами" и нажмите кнопку "Далее".

  5. Измените параметры свойств тегов задержки, вероятности, приложений и тегов пула по мере необходимости.

Просмотр результатов

Вы можете отслеживать количество случаев, когда средство проверки драйверов намеренно вызывает сбои при выделении ресурсов, отображая глобальный счетчик внедренных сбоев. В этом счетчике отображается общее количество распределений ресурсов, которые Средство проверки драйверов преднамеренно не смогло выполнить с момента последней перезагрузки.

Этот счетчик можно просмотреть в файле журнала проверяющего драйвера (/log), в командной строке (/запросе) или в диспетчере проверки драйверов. В Windows 2000 для просмотра глобальных счетчиков выберите вкладку "Глобальные счетчики ". В более поздних версиях Windows выберите отображение сведений о задаче "Проверенные драйверы ", а затем дважды нажмите клавишу NEXT . Дополнительные сведения см. в разделе "Мониторинг глобальных счетчиков".

Вы также можете отобразить количество намеренно неудачных выделений и количество всех выделений (для расчёта вероятности) с помощью расширения отладчика !верификатор. В следующем примере показан пример выходных данных !verifier .

В этом примере моделируются случайные отказы API, связанные с ограниченными ресурсами, что указывает на включение симуляции низких ресурсов. Намеренные сбои выделения ресурсов указывают количество преднамеренно неудачных выделений, а попытки выделения пула представляют общее количество выделений.

!verifier

Verify Level 5 ... enabled options are:
        Special pool
        Inject random low-resource API failures

Summary of All Verifier Statistics

RaiseIrqls                             0x2c671f
AcquireSpinLocks                       0xca1a02
Synch Executions                       0x10a623
Trims                                  0x0

Pool Allocations Attempted             0x862e0e
Pool Allocations Succeeded             0x8626e3
Pool Allocations Succeeded SpecialPool 0x768060
Pool Allocations With NO TAG           0x0
Pool Allocations Failed                0x34f
Resource Allocations Failed Deliberately   0x3f5

Чтобы отобразить трассировки стека для выделений, завершившихся ошибкой из-за средств Driver Verifier, используйте !verifier 4 в отладчике ядра.

В следующем примере показан пример выходных данных из !verifier 4. По умолчанию !verifier 4 отображает трассировки стека из четырех последних неудачных выделений, но его параметр Quantity можно использовать для увеличения количества отображаемых трассировок стека. Например, !verifier 0x80 отображает 128 последних неудачных выделений.

В этом примере обратите внимание, что средство проверки перехватило и заменило вызов драйвера ExAllocatePoolWithTag. Одна из наиболее распространенных причин сбоя драйвера возникает, когда драйвер пытается выделить память, а затем использует указатель, который функция выделения возвращает перед проверкой того, что этот указатель не равен NULL.

kd> !verifier 4
Resource fault injection history:
Tracker @ 8354A000 (# entries: 80, size: 80, depth: 8)

Entry @ 8354B258 (index 75)

    Thread: C2638220

    816760CB nt!VerifierExAllocatePoolWithTag+0x49
    A4720443 win32k!bDeleteAllFlEntry+0x15d
    A4720AB0 win32k!GreEnableEUDC+0x70
    A47218FA win32k!CleanUpEUDC+0x37
    A473998E win32k!GdiMultiUserFontCleanup+0x5
    815AEACC nt!MiDereferenceSession+0x74
    8146D3B4 nt!MmCleanProcessAddressSpace+0x112
    815DF739 nt!PspExitThread+0x603

Entry @ 8354B230 (index 74)

    Thread: 8436D770

    816760CB nt!VerifierExAllocatePoolWithTag+0x49
    A462141C win32k!Win32AllocPool+0x13
    A4725F94 win32k!StubGdiAlloc+0x10

Опыт проведения теста имитации низких ресурсов показывает, что большинство сбоев драйверов вызваны последним неудачным выделением. В приведенном выше примере авария была в пути win32k! GreEnableEUDC. Изучите код в процессе выделения памяти, чтобы найти причину сбоя.

Сведения о !verifier см. в документации по средствам отладки для Windows .

Чтобы просмотреть параметры в реестре в командной строке, используйте параметр /querysettings . Рассмотрим пример.

C:\>verifier /querysettings
Special pool: Disabled
Pool tracking: Disabled
Force IRQL checking: Disabled
I/O verification: Disabled
Enhanced I/O verification: Disabled
Deadlock detection: Disabled
DMA checking: Disabled
Security checks: Disabled
Force pending I/O requests: Disabled
Low resources simulation: Enabled
IRP Logging: Disabled
Miscellaneous checks: Disabled

Low Resources Simulation options:

- Fault injection probability: 1/10000.
- Fail only allocations using pool tags: Tag1 Tag2.
- Simulate low resources conditions only in applications: test1.exe test2.exe.
- Boot time delay: 2 minutes.

Verified drivers:

blah.sys