IFR (Inflight Trace Recorder) para registro em log de rastreamentos

O IFR (Gravador de Rastreamento inflight) é um recurso de rastreamento que permite que um provedor de rastreamento, como um driver de modo kernel ou um driver UMDF, crie um conjunto de buffers circulares na memória em que as mensagens de log mais recentes são preservadas. As mensagens de log podem ser exibidas usando um depurador.

O IFR é criado com base no rastreamento de software WPP. O principal benefício do IFR sobre o WPP é que ele é ativado automaticamente e você não precisa iniciar sessões de rastreamento com antecedência.

Aplica-se a:

  • Sistema operacional mínimo: Windows 8 para desenvolvedores de driver KMDF e WDM
  • Sistema operacional mínimo: Windows 10 para desenvolvedores de driver UMDF (2.15)

Como habilitar o Inflight Trace Recorder no Visual Studio

Primeiro, siga as etapas em Adicionando rastreamento de software WPP a um Driver do Windows.

Em seguida, na página de propriedades Projeto, em Propriedades de Configuração-WPP> Tracing-Function e Opções de> Macro-Habilitar> Gravador de Rastreamento de Simulação, selecione Sim.

Por fim, somente para UMDF, há uma etapa adicional: em WPP Tracing-Function> e Macro Options-Preprocessor> Definitions, adicione WPP_MACRO_USE_KM_VERSION_FOR_UM=1.

Como habilitar o Inflight Trace Recorder na linha de comando

Se você editar o arquivo .vcxproj manualmente, defina as seguintes entradas:

Para um driver KMDF ou WDM:

    <ClCompile Include=...>
        <WppEnabled>true</WppEnabled>
        <WppKernelMode>true</WppKernelMode>
        <WppRecorderEnabled>true</WppRecorderEnabled>
        ...
    </ClCompile>

Para um driver UMDF:

    <ClCompile Include=...>
        <WppEnabled>true</WppEnabled>
        <WppRecorderEnabled>true</WppRecorderEnabled>
        <WppPreprocessorDefinitions>WPP_MACRO_USE_KM_VERSION_FOR_UM=1</WppPreprocessorDefinitions>
        ...
    </ClCompile>

Como configurar parâmetros do Inflight Trace Recorder

Você pode configurar o IFR definindo as seguintes entradas opcionais do Registro na chave de parâmetro do driver.

Use as seguintes entradas do Registro:

LogPages: REG_DWORD

Defina como o número de páginas para armazenar o log padrão. O padrão é um.

VerboseOn: REG_DWORD

A configuração padrão de zero faz com que o IFR registre erros, avisos e eventos informativos. Defina como um para adicionar uma saída detalhada ao log.

WppRecorder_UseTimeStamp: REG_DWORD (disponível a partir do WDK build 22557)

Os drivers definem essa entrada como um para adicionar carimbos de data/hora a entradas de log que podem ser visualizadas usando !rcdrkd.rcdrlogdump ou !wdfkd.wdflogdump.

WppRecorder_PreciseTimeStamp: REG_DWORD (disponível a partir do WDK build 22557)

Se você quiser carimbos de data/hora mais precisos, além de WppRecorder_UseTimeStamp, adicione WppRecorder_PreciseTimeStamp usando a mesma sintaxe mostrada acima.

Exemplos

Nos exemplos a seguir, adicione as linhas entre os comentários inicial e final para definir o número de páginas de log como dois e ativar carimbos de data/hora.

Para um driver no modo kernel:

[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

Para um driver 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

Como enviar mensagens de rastreamento para o log padrão

Siga as instruções em Adicionando rastreamento de software WPP a um driver do Windows. Por exemplo:

  • Em DriverEntry, chame WPP_INIT_TRACING(DriverObject, RegistryPath).
  • Em EvtDriverUnload, chame WPP_CLEANUP(WdfDriverWdmGetDriverObject(Driver)).

Agora, o driver está livre para chamar a função de rastreamento conforme necessário. Por exemplo: TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT, "WdfDriverCreate failed, %!STATUS!", ntStatus);

Para obter mais informações, consulte WPP_INIT_TRACING e WPP_CLEANUP.

Como enviar mensagens de rastreamento para um log personalizado

Isso só se aplica a drivers no modo kernel (KMDF ou WDM).

Para a maioria dos drivers, o log padrão único é bom o suficiente. No entanto, em alguns cenários, é útil ter buffers de log separados para entidades distintas.

Por exemplo, ao escrever um driver de ônibus, talvez você queira que cada dispositivo filho tenha seu próprio buffer. Em seguida, você pode usar o depurador para despejar somente o log de um dispositivo filho específico.

Para configurar logs personalizados, o driver deve incluir <WppRecorder.h>. Em seguida, chame as seguintes APIs:

O driver também precisa definir uma nova macro de rastreamento que usa o identificador de log como o primeiro parâmetro. Para obter um exemplo, consulte o Driver de Exemplo da Torradeira.

Como adicionar informações de carimbo de data/hora a um log personalizado

Se o driver chamar WppRecorderLogCreate para criar identificadores de log adicionais, será possível habilitar carimbos de data/hora para alguns identificadores de log, mas não outros.

Para fazer isso, você precisa adicionar uma única linha ao código do driver para cada identificador de log que deve usar carimbos de data/hora. Para obter um exemplo de código, consulte WppRecorderLogCreate.

Observação

Essa funcionalidade está disponível a partir do WDK build 22557. Para obter informações sobre como direcionar uma versão específica, consulte Criando drivers para versões diferentes do Windows.

Como exibir mensagens de rastreamento no depurador

Para drivers KMDF e UMDF, use !wdfkd.wdflogdump como de costume. Ele imprimirá o log IFR da estrutura e o log IFR do driver.

Para drivers WDM, use !rcdrkd.rcdrloglist e !rcdrkd.rcdrlogdump.