Utiliser le débogage du noyau pour déboguer les échecs de test de fiabilité des principes de base de l’appareil
Cet article explique comment utiliser les commandes de débogage de noyau courantes pour déboguer les échecs de test de fiabilité des principes de base de l’appareil.
Définir des symboles
Vous trouverez des symboles de contenu du Kit de laboratoire matériel Windows sur le site Microsoft Public Symbols Server. Pour plus d’informations sur le serveur de symboles publics Microsoft, consultez Utiliser le serveur de symboles Microsoft pour obtenir des fichiers de symboles de débogage. Vous pouvez définir des symboles dans le débogueur du noyau en exécutant la commande .sympath (Définir le chemin du symbole).
Exemple :
Dans cet exemple, la commande .sympath définit le chemin du serveur de symboles publics dans le débogueur.
.sympath SRV*c:\localsymbols*https://msdl.microsoft.com/download/symbols
!analyze -v
Lorsque vous examinez les échecs de test provoqués par des vérifications de bogues système à partir du débogueur du noyau, la première commande que vous devriez émettre après avoir défini des symboles est !analyze. Cette commande identifie le code case activée bogue, la raison de l’case activée du bogue et la trace de la pile qui montre le composant défaillant. Pour plus d’informations sur cette commande, consultez Utilisation de l’extension !analyze .
Inspecter les traces de pile du processus de test
Les tests de fiabilité De base de l’appareil s’exécutent souvent en tant que Te.ProcessHost.exe ou Te.exe sur l’ordinateur de test. Il est utile d’examiner les traces de pile de ces processus de test lorsque vous examinez les vérifications de bogues système ou les blocages de test. Dans le cas de vérifications de bogues, les traces de pile peuvent aider à identifier le cas de test testé au moment de l’incident. Dans le cas de blocages de test, les traces de pile identifient les threads de test qui empêchent la progression du test.
Vous pouvez utiliser l’extension !process 0 0 pour répertorier tous les processus en cours d’exécution sur l’ordinateur de test, afin de trouver l’adresse de bloc EPROCESS du processus de test.
Vous pouvez ensuite utiliser l’extension !process /p /r pour obtenir des traces de pile complètes à partir des processus de test.
Pour plus d’informations sur l’extension !process, consultez !process et .process (Définir le contexte de processus).
Notez que la sortie !process contient le nombre de graduations pour chaque thread en cours d’exécution dans le processus. Lorsque vous examinez les blocages de test, les threads dont le nombre de graduations est élevé et qui contiennent des composants WDTF sur la pile (c’est-à-dire, les noms de modules qui commencent par « WDTF » sur la pile) doivent être examinés avec soin, car ces threads peuvent entraîner le blocage permanent des tests et finalement l’échec en raison d’un délai d’expiration.
Exemple :
Dans cet exemple, les extensions !process 0 0, !process /p /r et !process identifient un thread de test dont le nombre de graduations est très élevé, ce qui empêche la progression du 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
Basculer le contexte vers des threads et des trames pour afficher les locaux
Pour afficher les variables locales à partir d’une trame de pile, vous devez effectuer les actions suivantes :
Basculez le contexte vers le thread à l’aide de la commande .thread (Définir le contexte du registre).
Videz la pile avec les numéros de trame à l’aide de la commande kn (consultez Journalisation de la pile et du vidage.
Basculez vers le contexte de trame à l’aide de la commande .frame (Définir le contexte local).
Affichez les variables locales à l’aide de la commande dv (Afficher les variables locales).
Notes
Vous devez utiliser des symboles privés pour vider les variables locales.
Exemple :
Cet exemple utilise les commandes .thread, kn, .frame et dv pour vider des variables locales à partir d’un frame de pile :
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
Lorsque vous déboguez des blocages du test de fiabilité des principes fondamentaux de l’appareil, vous pouvez utiliser la commande !pnptriage pour répertorier les threads PNP actifs. Notez que la sortie !pnptriage contient le nombre de graduations pour chaque thread PNP en cours d’exécution dans le système. Lorsque vous examinez les blocages de test, les threads qui ont un nombre élevé de graduations doivent être soigneusement examinés, car ces threads peuvent entraîner le blocage permanent des tests et éventuellement l’échec en raison d’un délai d’expiration.
Extensions de débogage de pilote
Les extensions de débogueur de noyau suivantes peuvent déboguer des problèmes de pilote qui peuvent se produire lorsque vous exécutez des tests de fiabilité des principes de base de l’appareil : !drvobj, !devnode, !devobj, !devstack et !irp. Pour plus d’informations sur ces extensions, consultez Extensions en mode noyau.
Extensions du débogueur
Les outils de débogage pour Windows sont fournis avec des extensions de débogueur supplémentaires qui sont utiles pour résoudre les défaillances qui peuvent se produire lorsque vous exécutez des tests sur les types de pilotes suivants : USB, Stockage, NDIS, Graphics, Kernel-Mode Driver Framework (KMDF) et User-Mode Driver Framework (UMDF). Pour plus d’informations sur ces extensions, consultez Extensions spécialisées. Pour plus d’informations sur les outils de débogage pour Windows, consultez Télécharger et installer les outils de débogage pour Windows.
Rubriques connexes
Résolution des problèmes de test de fiabilité de base de l’appareil à l’aide de Windows HLK