Partilhar via


Usando o registrador de eventos da estrutura

O WDF inclui um registrador de rastreamento interno, às vezes chamado de In-flight Recorder (IFR) da estrutura. O registrador WDF cria um log de rastreamento que contém um histórico recente de eventos para cada driver WDF. Os logs de rastreio monitorizam o progresso dos pacotes de solicitação de E/S (IRPs) através da arquitetura e as solicitações correspondentes através de um controlador. Cada driver do Kernel-Mode Driver Framework (KMDF) e do User-Mode Driver Framework (UMDF) tem seu próprio log.

O registrador WDF está sempre habilitado. Para cada log de rastreamento, o registrador armazena registros de eventos em um buffer de memória circular. Opcionalmente, você pode ativar a verbosidade, o que faz com que o registrador de eventos registre informações adicionais que podem ajudá-lo a depurar seu driver, como entradas ou saídas de caminhos de código internos. Por padrão, o tamanho do buffer é uma página de memória e a verbosidade está desativada. Você pode alterar o tamanho e a verbosidade do buffer ajustando esses valores dentro do aplicativo WdfVerifier . Observe que ativar a verbosidade pode degradar o desempenho do sistema.

Você pode usar extensões do depurador WDF para exibir e salvar o log WDF durante a depuração interativa. Para exibir o log WDF durante uma sessão de depuração:

  1. Carregue os símbolos corretos. Você pode usar o comando do depurador .symfix+ para acrescentar o armazenamento de símbolos públicos da Microsoft ao seu caminho de símbolos existente. O armazenamento de dados de símbolos públicos inclui símbolos para os binários WDF. Você também pode querer carregar símbolos para os símbolos do driver.

    Para obter informações adicionais sobre como obter símbolos de janela e como definir o caminho de símbolo do depurador, consulte a documentação fornecida com o pacote de depuração do Windows.

  2. Carregue a biblioteca de extensões Wdfkd.dll no seu depurador. Se você estiver usando o depurador do kernel, poderá fazer isso usando o comando .load. Para carregar a versão correta do Wdfkd.dll você precisa especificar o caminho totalmente qualificado para a DLL. Por exemplo, você usaria o seguinte caminho em uma máquina host do depurador baseado em x86:

    .load "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\wdfkd.dll"
    

    Em seguida, você pode confirmar se a extensão está carregada usando o comando !chain para exibir todas as extensões carregadas.

    Para obter mais informações sobre a extensão do depurador de estrutura, use a extensão !wdfhelp. Para obter mais informações sobre o depurador do kernel, consulte a documentação fornecida com o pacote de depuração do Windows.

  3. Se o driver usa a versão 1.11 ou posterior do framework e você está usando o depurador do kernel do Windows 8 ou posterior, você pode pular esta etapa.

    Se o driver usa uma versão da estrutura anterior à 1.11, use !wdftmffile ou !wdfsearchpath para especificar um arquivo de formato de mensagem de rastreamento (.tmf) específico da plataforma ou um caminho para um arquivo .tmf. Os arquivos .tmf estão localizados em subdiretórios específicos da plataforma no WDK.

    Como os arquivos .tmf são específicos da versão, você deve especificar um arquivo .tmf que corresponda à versão da biblioteca de tempo de execução da estrutura que está em execução no momento. Por exemplo, se o KMDF versão 1.9 estiver em execução na máquina host:

    !wdftmffile c:\WinDDK\<version>\tools\tracing\x86\wdf01009.tmf
    

    Você também pode definir o caminho de pesquisa definindo a variável de ambiente TRACE_FORMAT_SEARCH_PATH. O comando !wdftmffile tem precedência sobre o caminho de pesquisa definido pela variável de ambiente.

    Para verificar o número da versão do framework, pode-se executar o comando !wdfldr extensão de depuração no depurador do kernel.

  4. Use a extensão!wdflogdump para exibir os registros do registrador de eventos. Por exemplo, a seguinte captura de tela de uma janela de comando WinDbg mostra um exemplo típico da saída de !wdflogdump :

    Captura de tela da saída da extensão !wdflogdump na janela de comando WinDbg.

Cada linha no log do framework é precedida por uma cadeia de caracteres chamada prefixo de mensagem de rastreamento . O registrador de rastreamento acrescenta este prefixo a cada mensagem que é escrita no log. Por padrão, o prefixo inclui um conjunto padrão de elementos de dados, mas você pode alterar os elementos padrão para atender às suas necessidades específicas. Você pode alterar a cadeia de caracteres de prefixo de um driver WDF, definindo a variável de ambiente TRACE_FORMAT_PREFIX ou usando o comando de extensão do depurador !wdfsettraceprefix.

Para definir a variável de ambiente, use um comando semelhante ao seguinte:

Set TRACE_FORMAT_PREFIX=%2!s!: %!FUNC!: %8!04x!.%3!04x!: %4!s!:

Este comando define o prefixo da mensagem de rastreamento para o seguinte:

SourceFile_LineNumber: FunctionName: ProcessID.ThreadID: SystemTime

Você também pode usar o comando !wdflogsave extension para salvar os registros do registrador de eventos em um arquivo de log de rastreamento de eventos (.etl) que você pode exibir usando TraceView.

Às vezes, pode-se usar a extensão de depurador !wdfcrashdump em um despejo de memória para exibir informações de log após as verificações de erros do sistema. As informações de log estarão disponíveis no despejo de memória apenas se o framework puder determinar que o seu driver causou o bug check ou se configurou o valor de registo ForceLogsInMiniDump para o driver.

Se um depurador for anexado quando a verificação de bug ocorrer, você poderá usar !wdfcrashdump para visualizar as informações de log imediatamente ou poderá visualizar as informações carregando o arquivo de despejo de memória. Devido a limitações de tamanho de um pequeno arquivo de despejo de memória, o log do driver que causou a falha pode não aparecer no dump.

A estrutura pode determinar se um driver específico causou os seguintes códigos de verificação de bug:

A partir da versão 2 do UMDF, o UMDF armazena o log de rastreamento UMDF (ou UMDF IFR) na memória não paginada do kernel. A estrutura aloca uma IFR por instância de host de driver (Wudfhost).

Para obter mais informações sobre os comandos de extensão do depurador, consulte Extensões do Depurador para Drivers Baseados em Framework.