Compartir a través de


Uso de la depuración de kernel para depurar errores de prueba de confiabilidad de los aspectos básicos del dispositivo

En este artículo se describe cómo usar comandos comunes de depuración de kernel para depurar errores de prueba de confiabilidad de los aspectos básicos del dispositivo.

Establecer símbolos

Puede encontrar símbolos de contenido del Kit de laboratorio de hardware de Windows en el sitio del servidor de símbolos públicos de Microsoft. Consulte Usar el servidor de símbolos de Microsoft para obtener archivos de símbolos de depuración para obtener más información sobre el servidor de símbolos públicos de Microsoft. Puede establecer símbolos en el depurador de kernel ejecutando el comando .sympath (Establecer ruta de acceso de símbolos ).

Ejemplo:

En este ejemplo, el comando .sympath establece la ruta de acceso del servidor de símbolos públicos en el depurador.

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

!analyze -v

Al investigar los errores de prueba causados por comprobaciones de errores del sistema desde el depurador de kernel, el primer comando que debe emitir después de establecer símbolos es !analyze. Este comando identifica el código de comprobación de errores, el motivo de la comprobación de errores y el seguimiento de la pila que muestra el componente de error. Consulte Uso de la extensión !analyze para obtener más información sobre este comando.

Inspección de seguimientos de pila del proceso de prueba

Las pruebas de confiabilidad de aspectos básicos del dispositivo se suelen ejecutar como Te.ProcessHost.exe o Te.exe en el equipo de prueba. Es útil revisar los seguimientos de la pila de estos procesos de prueba al investigar las comprobaciones de errores del sistema o los bloqueos de pruebas. En el caso de las comprobaciones de errores, los seguimientos de pila pueden ayudar a identificar el caso de prueba que se estaba probando en el momento del bloqueo. En el caso de bloqueos de pruebas, los seguimientos de pila identifican los subprocesos de prueba que impiden que la prueba avance.

Puede usar la extensión !process 0 0 para enumerar todos los procesos que se ejecutan en el equipo de prueba, para buscar la dirección de bloque EPROCESS del proceso de prueba.

A continuación, puede usar la extensión !process /p /r para obtener seguimientos completos de la pila de los procesos de prueba.

Para obtener más información sobre la extensión !process , vea !process y .process (Set Process Context)).

Tenga en cuenta que la salida del proceso ! contiene recuentos de tics para cada subproceso que se ejecuta en el proceso. Al investigar los bloqueos de prueba, los subprocesos que tienen un recuento de tics alto que contienen componentes WDTF en la pila (es decir, nombres de módulo que comienzan por "WDTF" en la pila) se deben revisar cuidadosamente porque estos subprocesos pueden hacer que las pruebas se bloqueen permanentemente y, finalmente, se produzca un error debido a un tiempo de espera.

Ejemplo:

En este ejemplo, !process 0 0, !process /p /r y !process extensions identifican un subproceso de prueba que tiene un recuento de tics muy alto, que impide que la prueba avance:

!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

Cambiar el contexto a subprocesos y marcos para ver variables locales

Para ver variables locales desde un marco de pila, debe realizar las siguientes acciones:

  1. Cambie el contexto al subproceso mediante el comando .thread (Establecer contexto de registro).

  2. Volcar la pila junto con números de marco mediante el comando kn (consulte Registro de pila y volcado de memoria).

  3. Cambie al contexto de marco mediante el comando .frame (Establecer contexto local).

  4. Vea las variables locales mediante el comando dv (Mostrar variables locales).

Nota

Debe usar símbolos privados para volcar variables locales.

Ejemplo:

En este ejemplo se usan comandos .thread, kn, .frame y dv para volcar variables locales desde un marco de pila:

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

Cuando se bloquea la prueba de confiabilidad de los aspectos básicos del dispositivo, puede usar el comando !pnptriage para enumerar los subprocesos PNP activos. Tenga en cuenta que la salida !pnptriage contiene recuentos de tics para cada subproceso PNP que se ejecuta en el sistema. Al investigar los bloqueos de pruebas, los subprocesos que tienen recuentos altos de tics deben revisarse cuidadosamente porque estos subprocesos pueden hacer que las pruebas se bloqueen permanentemente y, finalmente, se produzca un error debido a un tiempo de espera.

Extensiones de depuración de controladores

Las siguientes extensiones del depurador de kernel pueden depurar problemas de controladores que pueden producirse al ejecutar pruebas de confiabilidad de conceptos básicos del dispositivo: !drvobj, !devnode, !devobj, !devstack y !irp. Para obtener más información sobre estas extensiones, vea Kernel-Mode Extensions.

Extensiones del depurador

Herramientas de depuración para Windows incluye extensiones de depurador adicionales que son útiles para solucionar errores que pueden producirse al ejecutar pruebas en los siguientes tipos de controladores: USB, Storage, NDIS, Graphics, Kernel-Mode Driver Framework (KMDF) y User-Mode Driver Framework (UMDF). Para obtener más información sobre estas extensiones, vea Extensiones especializadas. Para obtener más información sobre las herramientas de depuración para Windows, vea Descargar e instalar herramientas de depuración para Windows.

Solución de problemas de pruebas de confiabilidad de los aspectos básicos del dispositivo mediante Windows HLK