Bagikan melalui


Gunakan penelusuran kesalahan kernel untuk men-debug kegagalan pengujian Keandalan Dasar-Dasar Perangkat

Ini menjelaskan cara menggunakan perintah penelusuran kesalahan kernel umum untuk men-debug kegagalan pengujian Keandalan Dasar-Dasar Perangkat.

Mengatur simbol

Anda dapat menemukan simbol konten Windows Hardware Lab Kit di situs Microsoft Public Symbols Server. Lihat Menggunakan Microsoft Symbol Server untuk mendapatkan file simbol debug untuk informasi selengkapnya tentang Microsoft Public Symbols Server. Anda dapat mengatur simbol di debugger kernel dengan menjalankan perintah .sympath (Set Symbol Path).

Contoh:

Dalam contoh ini, perintah .sympath mengatur jalur server simbol publik di debugger.

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

!analyze -v

Ketika Anda menyelidiki kegagalan pengujian yang disebabkan oleh pemeriksaan bug sistem dari debugger kernel, perintah pertama yang harus Anda keluarkan setelah Anda mengatur simbol adalah !analyze. Perintah ini mengidentifikasi kode pemeriksaan bug, alasan pemeriksaan bug, dan jejak tumpukan yang menunjukkan komponen yang rusak. Lihat Menggunakan Ekstensi !analyze untuk informasi selengkapnya tentang perintah ini.

Memeriksa jejak tumpukan proses pengujian

Pengujian Keandalan Dasar-Dasar Perangkat sering berjalan sebagai Te.ProcessHost.exe atau Te.exe pada komputer pengujian. Sangat berguna untuk meninjau jejak tumpukan dari proses pengujian ini ketika Anda menyelidiki pemeriksaan bug sistem atau pengujian macet. Dalam kasus pemeriksaan bug, jejak tumpukan dapat membantu mengidentifikasi kasus pengujian yang sedang diuji pada saat crash. Dalam kasus pengujian macet, jejak tumpukan mengidentifikasi utas pengujian apa pun yang mencegah pengujian berkembang.

Anda dapat menggunakan ekstensi !process 0 0 untuk mencantumkan semua proses yang berjalan di komputer pengujian, untuk menemukan alamat blok EPROCESS proses pengujian.

Anda kemudian dapat menggunakan ekstensi !process /p /r untuk mendapatkan jejak tumpukan penuh dari proses pengujian.

Untuk informasi selengkapnya tentang ekstensi !process , lihat !process dan .process (Set Process Context).

Perhatikan bahwa output !process berisi jumlah tick untuk setiap utas yang berjalan dalam proses. Saat Anda menyelidiki pengujian macet, utas yang memiliki jumlah tick tinggi yang berisi komponen WDTF pada tumpukan (yaitu, nama modul yang dimulai dengan "WDTF" pada tumpukan) harus ditinjau dengan hati-hati karena utas ini dapat menyebabkan pengujian menggantung secara permanen dan akhirnya gagal karena waktu habis.

Contoh:

Dalam contoh ini, !process 0 0, !process /p /r, dan !process extensions mengidentifikasi utas pengujian yang memiliki jumlah tick yang sangat tinggi, yang mencegah pengujian berkembang:

!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

Beralih konteks ke utas dan bingkai untuk melihat lokal

Untuk melihat variabel lokal dari bingkai tumpukan, Anda harus melakukan tindakan berikut:

  1. Alihkan konteks ke utas dengan menggunakan perintah .thread (Set Register Context).

  2. Buang tumpukan bersama dengan nomor bingkai dengan menggunakan perintah kn (lihat Stack dan Dump Logging.

  3. Beralih ke konteks bingkai dengan menggunakan perintah .frame (Set Local Context).

  4. Lihat lokal dengan menggunakan perintah dv (Tampilkan Variabel Lokal).

Catatan

Anda harus menggunakan simbol privat untuk mencadangkan variabel lokal.

Contoh:

Contoh ini menggunakan perintah .thread, kn, .frame, dan dv untuk mencadangkan variabel lokal dari bingkai tumpukan:

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

Saat Anda men-debug pengujian Keandalan Dasar-Dasar Perangkat macet, Anda dapat menggunakan perintah !pnptriage untuk mencantumkan utas PNP aktif. Perhatikan bahwa output !pnptriage berisi jumlah tick untuk setiap utas PNP yang berjalan dalam sistem. Saat Anda menyelidiki pengujian macet, utas yang memiliki jumlah tick tinggi harus ditinjau dengan hati-hati karena utas ini dapat menyebabkan pengujian menggantung secara permanen dan akhirnya gagal karena waktu habis.

Ekstensi penelusuran kesalahan driver

Ekstensi debugger kernel berikut dapat men-debug masalah driver yang dapat terjadi ketika Anda menjalankan pengujian Keandalan Dasar-Dasar Perangkat: !drvobj, !devnode, !devobj, !devstack, dan !irp. Untuk informasi selengkapnya tentang ekstensi ini, lihat Ekstensi Mode Kernel.

Ekstensi debugger

Alat Debugging untuk Windows dikirim dengan ekstensi debugger tambahan yang berguna untuk memecahkan masalah kegagalan yang dapat terjadi ketika Anda menjalankan pengujian terhadap jenis driver berikut: USB, Storage, NDIS, Graphics, Kernel-Mode Driver Framework (KMDF), dan User-Mode Driver Framework (UMDF). Untuk informasi selengkapnya tentang ekstensi ini, lihat Ekstensi Khusus. Untuk informasi selengkapnya tentang alat penelusuran kesalahan untuk Windows, lihat Mengunduh dan Menginstal Alat Debugging untuk Windows.

Pemecahan Masalah Pengujian Keandalan Dasar-Dasar Perangkat dengan menggunakan Windows HLK