Partilhar via


Vídeo: Analisando o seu driver com o código-fonte WDF

Este tópico contém um tutorial em vídeo que mostra como depurar o driver WDF (Windows Driver Frameworks) com acesso total ao código-fonte WDF. A seguir ao vídeo, apresenta-se o procedimento passo-a-passo para sua conveniência.

A depuração do código-fonte WDF permite-lhe entrar livremente no código do framework sem precisar baixar o código-fonte WDF. O depurador baixa automaticamente a versão correta do WDF do GitHub.

Por exemplo, se você estiver usando o WinDbg para depurar o driver WDF em uma máquina Windows 10 e o depurador estiver quebrado com o código da estrutura na pilha de chamadas, você poderá clicar duas vezes no quadro WDF na visualização Pilha de chamadas e o WinDbg baixará e abrirá automaticamente o arquivo de origem WDF relevante na linha correspondente. Em seguida, você pode percorrer o código e definir pontos de interrupção.

Este recurso está disponível para sistemas de destino que executam versões públicas do Windows 10, Technical Preview build 10041 ou posterior. Essas compilações têm arquivos de símbolos indexados de origem privada para KMDF (Wdf01000.sys) e UMDF (Wudfx02000.dll) disponíveis no Microsoft Public Symbol Server. A depuração no nível de origem do código WDF só está disponível no WinDbg e não no depurador do Visual Studio.

Início Rápido

Inicie uma sessão de depuração do kernel WinDbg na máquina de destino, entre e siga estas etapas:

  1. Defina o caminho do símbolo padrão usando .symfix. Isso define o caminho do símbolo para apontar para o servidor de símbolos em https://msdl.microsoft.com/download/symbols.

    kd> .symfix

  2. Defina o caminho de origem padrão usando .srcfix. Isso define o caminho de origem para srv*, o que informa ao depurador que deve recuperar os arquivos de origem dos locais especificados nos arquivos de símbolo dos módulos de destino.

    kd> .srcfix
    Source search path is: SRV*
    
  3. Recarregue símbolos usando .reload e confirme se os símbolos Wdf01000.sys (ou Wudfx02000.dll para UMDF) estão indexados na fonte. Como mostra a saída de !lmi abaixo, o Wdf01000.sys PDB está indexado na origem. Se o seu não estiver, consulte a seção Configuração do WinDbg abaixo.

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. Agora está tudo pronto! Uma maneira fácil de percorrer o código-fonte WDF é definir um ponto de interrupção na rotina de despacho de IRP da estrutura e, em seguida, percorrer o restante do código. Como um sistema Windows tem muitos drivers KMDF na caixa de entrada, o WDF está sempre carregado e em execução, portanto, esse ponto de interrupção será atingido imediatamente (sem a necessidade de carregar seu próprio driver).

    kd> bp Wdf01000!FxDevice::DispatchWithLock
    kd> g
    Breakpoint 0 hit
    Wdf01000!FxDevice::DispatchWithLock:
    87131670 8bff mov edi,edi 
    

Se isso não funcionar, confira as etapas de instalação do WinDbg abaixo.

Configuração do WinDbg

Se o exemplo acima não funcionou como esperado, talvez seja necessário executar uma ou mais das instruções abaixo.

Ativar o modo de depuração de origem

Verifique se a depuração no Modo Fonte está habilitada. Abra o menu Depurar e confirme se o Modo de origem está marcado.

Limpar cache de símbolos obsoletos

Se você depurou anteriormente drivers WDF para o mesmo destino do Windows, então você pode estar usando os símbolos WDF armazenados em cache localmente que não foram indexados de origem. Você pode verificar isso com o comando !lmi:

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

De acordo com Relatório de Carga acima, Wdf01000.pdb não é indexado por origem. Isso significa que o cache de símbolos WinDbg local está obsoleto. Para corrigir isso, descarregue o PDB do WinDbg, limpe o cache local (seu caminho pode diferir com base na saída !lmi acima) e recarregue o PDB:

kd> .reload /u Wdf01000.sys

CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

kd> .reload Wdf01000.sys

Agora execute !lmi para verificar novamente: o PDB deve aparecer como fonte indexada e uma janela de código-fonte deve aparecer.

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb 

Você pode usar a depuração no nível de origem do WDF não apenas para depuração ao vivo e análise de despejos de memória de falha, mas também para aprender mais sobre a estrutura interna do framework, definindo pontos de interrupção em funções principais, como o dispatcher IRP, e explorar os caminhos de código subsequentes.