Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
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.