Reproduzir a falha de teste executando o teste na linha de comando
Às vezes, é conveniente reproduzir falhas de teste executando os testes da linha de comando. A documentação a seguir pressupõe que o HLK (Hardware Lab Kit) já foi instalado no computador do controlador.
Executar um teste de Conceitos Básicos do Dispositivo na linha de comando
Para executar um teste de Conceitos básicos do dispositivo na linha de comando:
Crie uma pasta c:\temp no sistema em teste (SUT).
Copie todos os arquivos da \\< pasta hckcontroller>\taefbinaries\<arch> para c:\temp no SUT.
Em <que hckcontroller é o nome do controlador do Windows HLK (Hardware Lab Kit) do Windows e <arch> é a plataforma SUT.
Para instalar e iniciar o serviço TAEF , digite os seguintes comandos em um prompt de comando:
Vá para a pasta 'temp' criada acima:
Em X86 ou X64: cd c:\temp
Em Arm ou Arm64: cd c:\temp\MinTe
wex.services.exe /install:Te.Service
sc start Te.Service
Copie todos os arquivos do \\<diretório hckcontroller>\tests\<arch>\DevFund\ para c:\temp.
Altere o diretório para c:\temp e execute o seguinte comando (observe que Te.exe reside em c:\temp\MinTe no Arm e arm64):
c:\temp\Te.exe Devfund_<testname>.dll /name:"<test case name>" /p:"DQ=DeviceID='<Device Instance Path of device under test from Device Manager>'" /RebootStateFile:state.xml
Em <que nome> do caso de teste é o nome do teste no binário de teste.
A opção /name é opcional. Como alguns binários de teste contêm vários testes, a opção /name especifica quais testes devem ser executados. Se não for especificado, todos os testes contidos no binário de teste serão executados em sequência. A lista de testes em um binário de teste pode ser obtida executando o seguinte comando:
Te.exe Devfund_<testname>.dll /list
Por exemplo, o Devfund_PnPDTest.dll contém a maioria dos testes relacionados ao PnP:
c:\temp>Te.exe Devfund_PnPDTest.dll /list Test Authoring and Execution Framework v10.21 for x64 c:\temp\Devfund_PnPDTest.dll PNPDTest PNPDTest::PNPDisableAndEnableDevice PNPDTest::PNPRemoveAndRestartDevice PNPDTest::PNPCancelRemoveDevice PNPDTest::PNPCancelStopDevice PNPDTest::PNPTryStopAndRestartDevice PNPDTest::PNPTryStopDeviceRequestNewResourcesAndRestartDevice PNPDTest::PNPTryStopDeviceAndFailRestart PNPDTest::PNPSurpriseRemoveAndRestartDevice PNPDTest::PNPDIFRemoveAndRescanParentDevice PNPDTest::DisableEnhancedDeviceTestingSupport
O comando para executar um único teste desse binário de teste pode ter esta aparência:
c:\temp\Te.exe Devfund_PnPDTest.dll.dll /name:PNPDTest::PNPSurpriseRemoveAndRestartDevice /p:"DQ=DeviceID='my\device\id'" /RebootStateFile:state.xml
O nome do teste no binário de teste não será exatamente o mesmo que o título do teste. Para obter um mapeamento de nomes binários de teste para nomes de teste HLK, consulte Testes Device.DevFund.
Como usar /BreakOnError para invadir o depurador
Se a tarefa "Executar Teste" em um teste de Conceitos Básicos do Dispositivo falhar e você quiser examinar o estado do sistema no depurador de kernel ao mesmo tempo em que o teste registra uma falha, você pode executar o teste manualmente em um prompt de comando junto com o depurador de kernel e passar a opção de linha de comando /BreakOnError para Te.exe.
Executar Te.exe com a opção /BreakOnError faz com que o sistema interrompa o depurador de kernel quando o teste estiver pronto para registrar um erro. Para obter mais informações sobre como configurar um depurador de kernel, consulte Configurando Kernel-Mode depuração manualmente.
Para executar um teste de Conceitos básicos do dispositivo com a opção /BreakOnError , adicione a opção conforme mostrado abaixo:
Run c:\temp\Te.exe Devfund_<testname>.dll /p:"DQ=DeviceID='<Device Instance Path of device under test from Device Manager>'" /RebootStateFile:state.xml /BreakOnError /name:"*<test case name>*"
Em <que nome> do caso de teste é o nome do teste.
Cenário de depuração de exemplo
Você pode investigar a falha a seguir executando novamente o teste e fazendo com que o sistema interrompa o depurador quando o teste registra a falha na nova execução.
WDTF_FUZZTEST : INFO : Running IOCTL Fuzzing Test on surface \DosDevices\usb#vid_045e&pid_f0ca&mi_00#7&12099dde&0&0000#{0b9f1048-b94b-dc9a-4ed7-fe4fed3a0deb}\{8de0ff21-6c06-4c27-bfe0-e62612c015ae}. Access Mode=NO SYNC. Open Type=TREE_CONNECT. Opened with access 1201bf
WDTF_FUZZTEST : ERROR : Test thread exceeded timeout limit. Terminating thread
WDTF_FUZZTEST : ERROR : Last logged operation: ZwDeviceIoControlFile, CtrlCode=0x22e10b, InBuf=0xfffffc00, 0 OutBuf=0xfffffc00, 0
WDTF_FUZZTEST : INFO : Successfully terminated test thread.
Você pode definir um ponto de interrupção no depurador usando o seguinte comando:
Te.exe Devfund_FuzzTest_WLK_Certification.dll /p:"DQ=DeviceID='USB\VID_045E&PID_F0CA&MI_00\7&12099DDE&0&0000'" /RebootStateFile:state.xml /BreakOnError /name:"*IOCTLTest*"
Os testes de Conceitos Básicos do Dispositivo são executados como Te.ProcessHost.exe (se existirem) ou como Te.exe (se Te.ProcessHost.exe não existir). A revisão de threads em execução nesses processos de teste pode ajudar na triagem de travamentos e/ou falhas de teste.
Você pode obter a ID do processo de Te.ProcessHost.exe executando o seguinte comando:
!process 0 0 Te.ProcessHost.exe
Alterne o contexto do processo no depurador para o processo de teste:
.process /p /r <process id>
Informações do processo de despejo:
!process <process id>