Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Inflight Trace Recorder (IFR) — это функция трассировки, которая позволяет поставщику трассировки, например драйверу режима ядра или драйверу UMDF, создавать набор циклических буферов в памяти, в которых сохраняются последние сообщения журнала. Сообщения журнала можно просматривать с помощью отладчика.
IFR построен на основе программной трассировки WPP. Основное преимущество IFR по сравнению с WPP заключается в том, что оно включается автоматически, что вам не нужно заранее запускать сеансы трассировки.
Относится к:
- Минимальная ОС: Windows 8 для разработчиков драйверов KMDF и WDM
- Минимальная ОС: Windows 10 для разработчиков драйверов UMDF (2.15)
Как включить регистратор трассировки Inflight в Visual Studio
Сначала выполните действия, описанные в разделе "Добавление трассировки программного обеспечения WPP в драйвер Windows".
Затем на странице свойств проекта в разделе "Свойства конфигурации->трассировка WPP->Функции и параметры макроса->Включите средство записи трассировки в режиме 'В полете', выберите 'Да'.
Наконец, только для UMDF существует один дополнительный шаг: в разделе "Трассировка WPP-Опции функций и макросов-определения препроцессора", добавьте WPP_MACRO_USE_KM_VERSION_FOR_UM=1
.
Включение Inflight Trace Recorder из командной строки
Если изменить файл .vcxproj вручную, задайте следующие записи:
Для драйвера KMDF или WDM:
<ClCompile Include=...>
<WppEnabled>true</WppEnabled>
<WppKernelMode>true</WppKernelMode>
<WppRecorderEnabled>true</WppRecorderEnabled>
...
</ClCompile>
Для драйвера UMDF:
<ClCompile Include=...>
<WppEnabled>true</WppEnabled>
<WppRecorderEnabled>true</WppRecorderEnabled>
<WppPreprocessorDefinitions>WPP_MACRO_USE_KM_VERSION_FOR_UM=1</WppPreprocessorDefinitions>
...
</ClCompile>
Как настроить параметры регистратора трассировки в полете
Вы можете настроить IFR, задав следующие необязательные записи реестра в разделе параметра драйвера.
Используйте следующие записи реестра:
LogPages: REG_DWORD
Задайте для хранения журнала по умолчанию количество страниц. Значение по умолчанию — "один".
VerboseOn: REG_DWORD
Значение по умолчанию ноль вызывает регистрацию ошибок, предупреждений и информационных событий в IFR. Установите значение один, чтобы добавить развернутый вывод в журнал.
WppRecorder_UseTimeStamp: REG_DWORD (доступно начиная с сборки WDK 22557)
Драйверы задают эту запись для добавления меток времени в записи журнала, которые затем можно просматривать с помощью !rcdrkd.rcdrlogdump или !wdfkd.wdflogdump.
WppRecorder_PreciseTimeStamp: REG_DWORD (доступно начиная с сборки WDK 22557)
Если вы хотите более точные метки времени в дополнение к WppRecorder_UseTimeStamp, добавьте WppRecorder_PreciseTimeStamp с помощью того же синтаксиса, показанного выше.
Примеры
В следующих примерах добавьте строки между начальными и конечными комментариями, чтобы задать количество страниц журнала двумя и включить метки времени.
Для драйвера в режиме ядра:
[IfrSample_Service_Inst]
DisplayName = %IfrSample.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\IfrSample.sys
; =============== START
AddReg = IfrSample_Service_Inst.AddReg
[IfrSample_Service_Inst.AddReg]
HKR, "Parameters", "LogPages", %REG_DWORD%, 2
HKR, "Parameters", "WppRecorder_UseTimeStamp", %REG_DWORD%, 1
; =============== END
[Strings]
REG_DWORD = 0x00010001
Для драйвера UMDF:
[IfrSampleUm_Install]
UmdfLibraryVersion=$UMDFVERSION$
ServiceBinary=%13%\IfrSampleUm.dll
; =============== START
AddReg=IfrSampleUm_Install.AddReg
[IfrSampleUm_Install.AddReg]
HKR, "Parameters", "LogPages", %REG_DWORD%, 2
HKR, "Parameters", "WppRecorder_UseTimeStamp", %REG_DWORD%, 1
; =============== END
Как отправить сообщения трассировки в журнал по умолчанию
Следуйте инструкциям по добавлению трассировки программного обеспечения WPP в драйвер Windows. Рассмотрим пример.
- В DriverEntry вызовите
WPP_INIT_TRACING(DriverObject, RegistryPath)
. - В EvtDriverUnload вызовите
WPP_CLEANUP(WdfDriverWdmGetDriverObject(Driver))
.
Теперь драйвер может вызвать функцию трассировки по мере необходимости. Например: TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT, "WdfDriverCreate failed, %!STATUS!", ntStatus);
См. дополнительные сведения в WPP_INIT_TRACING и WPP_CLEANUP.
Отправка сообщений трассировки в пользовательский журнал
Это относится только к драйверам режима ядра (KMDF или WDM).
Для большинства драйверов один журнал по умолчанию достаточно хорош. Однако в некоторых сценариях полезно иметь отдельные буферы журнала для отдельных сущностей.
Например, при написании драйвера шины может потребоваться, чтобы у каждого дочернего устройства был собственный буфер. Затем можно использовать отладчик для выгрузки исключительно журнала конкретного дочернего устройства.
Чтобы настроить пользовательские журналы, драйвер должен включать компонент <WppRecorder.h>
. Затем вызовите следующие API:
- WppRecorderLogCreate для создания нескольких буферов журнала
- WppRecorderLogDelete перед вызовом WPP_CLEANUP.
- WppRecorderLogSetIdentifier , чтобы задать строковый идентификатор для заданного журнала записи (необязательно)
- WppRecorderConfigure чтобы отключить журнал по умолчанию (необязательно)
Драйвер также должен определить новый макрос трассировки, который принимает дескриптор журнала в качестве первого параметра. Пример см. в драйвере примера тостера.
Как добавить временную метку в пользовательский журнал
Если драйвер вызывает WppRecorderLogCreate для создания дополнительных дескрипторов журналов, можно включить метки времени для некоторых дескрипторов журналов, но не других.
Для этого необходимо добавить одну строку в код драйвера для каждого дескриптора журнала, который должен использовать метки времени. Пример кода см. в разделе WppRecorderLogCreate.
Замечание
Эта функция доступна начиная с сборки WDK 22557. Сведения о целевом выпуске см. в статье "Создание драйверов для разных версий Windows".
Просмотр сообщений трассировки в отладчике
Для драйверов KMDF и UMDF используйте !wdfkd.wdflogdump как обычно. Он выведет журнал IFR платформы и журнал IFR драйвера.
Для драйверов WDM используйте !rcdrkd.rcdrloglist и !rcdrkd.rcdrlogdump.