Поделиться через


Использование отладки ядра для отладки сбоев тестирования надежности устройств

Здесь описывается, как использовать распространенные команды отладки ядра для отладки сбоев тестов надежности в разделе Основы устройств.

Установка символов

Вы можете найти символы содержимого Комплекта лабораторий оборудования Windows на сайте Сервера общедоступных символов Майкрософт. Дополнительные сведения о сервере общедоступных символов Майкрософт см. в статье Использование сервера символов Майкрософт для получения файлов отладочных символов . Вы можете задать символы в отладчике ядра, выполнив команду .sympath (Задать путь к символу).

Пример.

В этом примере команда .sympath задает путь к серверу public symbols в отладчике.

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

!analyze -v

При исследовании тестовых сбоев, вызванных проверками системных ошибок из отладчика ядра, первая команда, которую следует выполнить после задания символов, — !analyze. Эта команда определяет код ошибки проверка, причину проверка ошибки и трассировку стека, показывающую компонент сбоя. Дополнительные сведения об этой команде см. в разделе Использование расширения !analyze .

Проверка трассировок стека процесса тестирования

Тесты надежности "Основы устройства" часто выполняются какTe.ProcessHost.exe или Te.exe на тестовом компьютере. Полезно просматривать трассировки стека из этих процессов тестирования при анализе проверок системных ошибок или зависаний тестов. В случае проверки ошибок трассировки стека могут помочь определить тестовый случай, который тестировался во время сбоя. В случае зависания теста трассировки стека идентифицируют все потоки тестирования, которые препятствуют выполнению теста.

С помощью расширения !process 0 0 можно получить список всех процессов, запущенных на тестовом компьютере, чтобы найти адрес блока EPROCESS тестового процесса.

Затем можно использовать расширение !process /p /r для получения полных трассировок стека из тестовых процессов.

Дополнительные сведения о расширении !process см. в разделах !process и .process (set Process Context).

Обратите внимание, что выходные данные !process содержат количество тактов для каждого потока, выполняющегося в процессе. При анализе зависания тестов следует тщательно проверять потоки с высоким числом тактов, которые содержат компоненты WDTF в стеке (т. е. имена модулей, начинающиеся с "WDTF" в стеке), так как эти потоки могут привести к постоянному зависаю тестов и в конечном итоге завершиться сбоем из-за истечения времени ожидания.

Пример.

В этом примере расширения !process 0 0, !process /p /r и !process идентифицируют поток тестирования с очень высоким числом тактов, что предотвращает выполнение теста:

!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

Переключение контекста на потоки и кадры для просмотра локальных параметров

Чтобы просмотреть локальные переменные из кадра стека, необходимо выполнить следующие действия:

  1. Переключите контекст в поток с помощью команды .thread (Set Register Context).

  2. Дамп стека вместе с номерами кадров с помощью команды kn (см. раздел Ведение журнала стека и дампа).

  3. Переключитесь в контекст фрейма с помощью команды .frame (Set Local Context).

  4. Просмотрите локальные значения с помощью команды dv (Отображение локальных переменных).

Примечание

Для дампа локальных переменных необходимо использовать частные символы.

Пример.

В этом примере используются команды THREAD, KN, .frame и DV для дампа локальных переменных из кадра стека:

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

При отладке теста надежности "Основы устройства" можно использовать команду !pnptriage , чтобы получить список активных потоков PNP. Обратите внимание, что выходные данные !pnptriage содержат счетчики тактов для каждого потока PNP, выполняющегося в системе. При анализе зависания тестов следует тщательно проверять потоки с высоким числом тактов, так как эти потоки могут привести к зависаю тестов и в конечном итоге завершиться сбоем из-за истечения времени ожидания.

Расширения отладки драйверов

Следующие расширения отладчика ядра могут отлаживать проблемы с драйверами, которые могут возникать при выполнении тестов надежности основ устройства: !drvobj, !devnode, !devobj, !devstack и !irp. Дополнительные сведения об этих расширениях см. в разделе Расширения режима ядра.

Расширения отладчика

Средства отладки для Windows поступают с дополнительными расширениями отладчика, которые полезны для устранения неполадок, которые могут возникнуть при выполнении тестов для следующих типов драйверов: USB, Storage, NDIS, Graphics, Kernel-Mode Driver Framework (KMDF) и User-Mode Driver Framework (UMDF). Дополнительные сведения об этих расширениях см. в разделе Специализированные расширения. Дополнительные сведения об инструментах отладки для Windows см. в статье Скачивание и установка средств отладки для Windows.

Устранение неполадок при тестировании надежности основных устройств с помощью Windows HLK