Condividi tramite


Usare il debug del kernel per eseguire il debug degli errori di test dell'affidabilità dei concetti fondamentali del dispositivo

In questo modo viene descritto come usare i comandi comuni di debug del kernel per eseguire il debug degli errori di test di affidabilità dei concetti fondamentali del dispositivo.

Impostare i simboli

I simboli di contenuto di Windows Hardware Lab Kit sono disponibili nel sito Microsoft Public Symbols Server. Per altre informazioni sul server dei simboli pubblici Microsoft, vedere Utilizzare il server dei simboli Microsoft per ottenere i file di simboli di debug . È possibile impostare i simboli nel debugger del kernel eseguendo il comando .sympath (Set Symbol Path).

Esempio:

In questo esempio, il comando con estensione sympath imposta il percorso del server dei simboli pubblici nel debugger.

.sympath SRV*c:\localsymbols*https://msdl.microsoft.com/download/symbols

!analyze -v

Quando si esaminano gli errori di test causati dai controlli dei bug di sistema dal debugger del kernel, il primo comando da eseguire dopo aver impostato i simboli è !analyze. Questo comando identifica il codice di controllo dei bug, il motivo del controllo dei bug e l'analisi dello stack che mostra il componente di errore. Per altre informazioni su questo comando, vedere Uso dell'estensione !analyze .

Esaminare le tracce dello stack del processo di test

I test di affidabilità dei concetti fondamentali del dispositivo vengono spesso eseguiti come Te.ProcessHost.exe o Te.exe nel computer di test. È utile esaminare le tracce dello stack da questi processi di test quando si esaminano i controlli dei bug di sistema o i blocchi di test. In caso di controlli di bug, le analisi dello stack consentono di identificare il test case che è stato testato al momento dell'arresto anomalo. In caso di blocchi di test, le analisi dello stack identificano eventuali thread di test che impediscono l'avanzamento del test.

È possibile usare l'estensione !process 0 0 per elencare tutti i processi in esecuzione nel computer di test, per trovare l'indirizzo del blocco EPROCESS del processo di test.

È quindi possibile usare l'estensione !process /p /r per ottenere tracce dello stack complete dai processi di test.

Per altre informazioni sull'estensione !process , vedere !process e .process (Set Process Context).

Si noti che l'output di !process contiene i conteggi dei segni di graduazione per ogni thread in esecuzione nel processo. Quando si esaminano i blocchi dei test, i thread con un numero di tick elevato che contengono componenti WDTF nello stack (ovvero i nomi dei moduli che iniziano con "WDTF" nello stack) devono essere esaminati attentamente perché questi thread possono causare l'blocco permanente dei test e alla fine hanno esito negativo a causa di un timeout.

Esempio:

In questo esempio, !process 0 0, !process /p /r e !process extensions identificano un thread di test con un conteggio di tick molto elevato, che impedisce l'avanzamento del test:

!process 0 0 Te.ProcessHost.exe 
    PROCESS fffffa80093c6340
    SessionId: 1 Cid: 1320 Peb: 7f6595b3000 ParentCid: 12a0
    DirBase: 21eee000 ObjectTable: fffff8a0035b0a00 HandleCount: 327. 
    Image: TE. ProcessHost.exe
.process /p /r fffffa80093c6340
!process fffffa80093c6340 


        THREAD fffffa800b2be8c0  Cid 0964.0eac  Teb: 000007f601ba6000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
            fffffa800b2a11d0  SynchronizationEvent
            fffffa800b300640  SynchronizationEvent
        Not impersonating
        DeviceMap                 fffff8a0014b9c80
        Owning Process            fffffa800b302940       Image:         TE.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      210995         Ticks: 405945 (0:01:45:32.782)
        Context Switch Count      51             IdealProcessor: 2             
        UserTime                  00:00:00.015
        KernelTime                00:00:00.015
        Win32 Start Address WDTFInterfaces!TsSingleWorkerThread (0x000007fe3a567f28)
        Stack Init fffff8800eb5edd0 Current fffff8800eb5dee0
        Base fffff8800eb5f000 Limit fffff8800eb59000 Call 0
        Priority 9 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Kernel stack not resident.
        Child-SP          RetAddr           Call Site
        fffff880`0eb5df20 fffff803`78b27f7c nt!KiSwapContext+0x76
        (Inline Function) --------`-------- nt!KiSwapThread+0xf4 (Inline Function @ fffff803`78b27f7c)
        fffff880`0eb5e060 fffff803`78aaf4ab nt!KiCommitThreadWait+0x23c
        fffff880`0eb5e120 fffff803`78b257a0 nt!KiWaitForAllObjects+0x3bb
        fffff880`0eb5e3c0 fffff803`78ecb3dc nt!KeWaitForMultipleObjects+0x4ae
        fffff880`0eb5e470 fffff803`78ecb853 nt!ObWaitForMultipleObjects+0x29c
        fffff880`0eb5e980 fffff803`78aff053 nt!NtWaitForMultipleObjects+0xe3
        fffff880`0eb5ebd0 000007fe`45d2315b nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff880`0eb5ec40)
        00000083`7cdef148 000007fe`430912c6 ntdll!ZwWaitForMultipleObjects+0xa
        00000083`7cdef150 000007fe`368641b5 KERNELBASE!WaitForMultipleObjectsEx+0xe5
        00000083`7cdef430 000007fe`3a566793 WDTFAudioSimpleIoAction!CAudioImpl::RunIO+0x3d1
        00000083`7cdef520 000007fe`3a566ea0 WDTFInterfaces!CSimpleIOEx::PerformIO+0x10f
        00000083`7cdef5b0 000007fe`3a56706b WDTFInterfaces!CSimpleIOExWrap::PerformIO+0x28
        00000083`7cdef5e0 000007fe`3a553fe5 WDTFInterfaces!CMTest_Receiver::Run+0x77
        00000083`7cdefe20 000007fe`3a5578ac WDTFInterfaces!CSimpleIO_MTestEx::ActionThread+0x105
        00000083`7cdefeb0 000007fe`3a567f3e WDTFInterfaces!CMTEXThread::ThreadWorker+0xc
        00000083`7cdefee0 000007fe`4319167e WDTFInterfaces!TsSingleWorkerThread+0x16
        00000083`7cdeff20 000007fe`45d3c3f1 KERNEL32!BaseThreadInitThunk+0x1a
        00000083`7cdeff50 00000000`00000000 ntdll!RtlUserThreadStart+0x1d

Impostare il contesto su thread e frame per visualizzare le variabili locali

Per visualizzare le variabili locali da uno stack frame, è necessario eseguire le azioni seguenti:

  1. Passare al contesto del thread usando il comando .thread (Set Register Context).

  2. Eseguire il dump dello stack insieme ai numeri di frame usando il comando kn (vedere Stack and Dump Logging( Stack and Dump Logging).

  3. Passare al contesto del frame usando il comando .frame (Imposta contesto locale).

  4. Visualizzare le variabili locali usando il comando dv (Visualizza variabili locali).

Nota

È necessario usare i simboli privati per eseguire il dump delle variabili locali.

Esempio:

Questo esempio usa i comandi .thread, kn, .frame e dv per eseguire il dump delle variabili locali da un stack frame:

3: kd> .thread fffffa8009da7b00
Implicit thread is now fffffa80`09da7b00

3: kd> kn
  *** Stack trace for last set context - .thread/.cxr resets it
# Child-SP          RetAddr           Call Site
00 fffff880`054a03a0 fffff801`05caaf7c nt!KiSwapContext+0x76
01 fffff880`054a04e0 fffff801`05ca8d9f nt!KiCommitThreadWait+0x23c
02 fffff880`054a05a0 fffff801`05f98841 nt!KeWaitForSingleObject+0x1cf
03 fffff880`054a0630 fffff801`061f253d nt!IopCancelAlertedRequest+0x71
04 fffff880`054a0670 fffff801`0604fc5d nt! ?? ::NNGAKEGL::`string'+0x1caaf
05 fffff880`054a0860 fffff801`060552b8 nt!ObpLookupObjectName+0x7a1
06 fffff880`054a0990 fffff801`06066ebe nt!ObOpenObjectByName+0x258
07 fffff880`054a0a60 fffff801`06067609 nt!IopCreateFile+0x37c
08 fffff880`054a0b00 fffff801`05c82053 nt!NtCreateFile+0x79
09 fffff880`054a0b90 000007fa`1a4930fa nt!KiSystemServiceCopyEnd+0x13
0a 00000038`d21bb478 000007fa`0677feef ntdll!NtCreateFile+0xa
0b 00000038`d21bb480 000007fa`0678e9a2 WDTFFuzzTestAction!DPETryOpenDevice+0x2b3
0c 00000038`d21bcde0 000007fa`0678e892 WDTFFuzzTestAction!CWDTFFuzz_MTestImpl::AttemptToOpenSurface+0x66
0d 00000038`d21bce50 000007fa`0678b84c WDTFFuzzTestAction!CWDTFFuzz_MTestImpl::FindAttackSurfaces+0x16e
0e 00000038`d21bf6c0 000007fa`0678a4d9 WDTFFuzzTestAction!CWDTFFuzz_MTestImpl::ActionThread+0x200
0f 00000038`d21bf760 000007fa`1a17167e WDTFFuzzTestAction!ActionThreadStart+0x9
10 00000038`d21bf790 000007fa`1a4ac3f1 KERNEL32!BaseThreadInitThunk+0x1a
11 00000038`d21bf7c0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d

3: kd> .frame b
0b 00000038`d21bb480 000007fa`0678e9a2 WDTFFuzzTestAction!DPETryOpenDevice+0x2b3

3: kd> dv
szName = 0x00000038`d21bce90
bSync = 0n0
ppdevice = 0x00000038`d21bce10
messageBuffer = wchar_t [2048] "Attempting to open device : \DosDevices\root#multiportserial#0000#{05caff94-7b1e-420c-8c70-d8361bc4ee0a}"
oa = struct _OBJECT_ATTRIBUTES

!pnptriage

Quando si esegue il debug dei blocchi dei test di affidabilità dei concetti fondamentali del dispositivo, è possibile usare il comando !pnptriage per elencare i thread PNP attivi. Si noti che l'output !pnptriage contiene i conteggi dei segni di graduazione per ogni thread PNP in esecuzione nel sistema. Quando si esaminano i blocchi dei test, i thread con conteggi di graduazione elevati devono essere esaminati attentamente perché questi thread possono causare il blocco permanente dei test e alla fine hanno esito negativo a causa di un timeout.

Estensioni di debug dei driver

Le estensioni del debugger del kernel seguenti possono eseguire il debug dei problemi del driver che possono verificarsi quando si eseguono test di affidabilità dei concetti fondamentali del dispositivo: !drvobj, !devnode, !devobj, !devstack e !irp. Per altre informazioni su queste estensioni, vedere Estensioni in modalità kernel.

Estensioni del debugger

Gli strumenti di debug per Windows sono dotati di estensioni del debugger aggiuntive utili per risolvere gli errori che possono verificarsi quando si eseguono test sui tipi di driver seguenti: USB, Archiviazione, NDIS, Grafica, Kernel-Mode Driver Framework (KMDF) e User-Mode Driver Framework (UMDF). Per altre informazioni su queste estensioni, vedere Estensioni specializzate. Per altre informazioni sugli strumenti di debug per Windows, vedere Scaricare e installare gli strumenti di debug per Windows.

Risoluzione dei problemi relativi ai test di affidabilità dei concetti fondamentali dei dispositivi tramite Windows HLK