共用方式為


使用核心偵錯對裝置基礎可靠性測試失敗進行偵錯

這描述如何使用常見的核心偵錯命令來偵錯裝置基本概念可靠性測試失敗。

設定符號

您可以在 Microsoft 公用符號伺服器網站上找到 Windows 硬體實驗室套件內容符號。 如需 Microsoft 公用符號伺服器的詳細資訊,請參閱 使用 Microsoft 符號伺服器取得偵 錯符號檔。 您可以在核心偵錯工具中設定符號,方法是執行 [設定符號路徑]) 命令 (。

範例︰

在此範例中,.andand 命令會在偵錯工具中設定公用符號伺服器路徑。

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

!analyze -v

當您從核心偵錯工具調查系統錯誤檢查所造成的測試失敗時,您應該在設定符號之後發出的第一個命令是 !analyze。 此命令會識別錯誤檢查程式碼、錯誤檢查的原因,以及顯示錯誤元件的堆疊追蹤。 如需此命令的詳細資訊 ,請參閱使用 !analyze 延伸模組

檢查測試程式的堆疊追蹤

裝置基本概念可靠性測試通常會在測試電腦上以 Te.ProcessHost.exeTe.exe 的形式執行。 當您調查系統錯誤檢查或測試停止回應時,檢閱來自這些測試程式的堆疊追蹤很有用。 在錯誤檢查的情況下,堆疊追蹤有助於識別在當機時所測試的測試案例。 在測試停止回應的情況下,堆疊追蹤會識別任何防止測試進行的測試執行緒。

您可以使用 !process 0 0 擴充功能來列出測試電腦上執行的所有進程,以尋找測試進程 EPROCESS 區塊位址。

然後,您可以使用 !process /p /r 擴充功能,從測試進程取得完整的堆疊追蹤。

如需 !process 延伸模組的詳細資訊,請參閱 !process.process (設定進程內容)

請注意, !process 輸出包含處理常式中執行之每個執行緒的刻度計數。 當您調查測試停止回應時,堆疊上含有 WDTF 元件的高刻度計數的執行緒 (即應該仔細檢閱以堆疊上的 「WDTF」 開頭的模組名稱) ,因為這些執行緒可能會導致測試永久停止回應,最後因為逾時而失敗。

範例︰

在此範例中, !process 0 0!process /p /r!process extensions 會識別具有非常高刻度計數的測試執行緒,以防止測試進行:

!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 (設定暫存器內容) 命令,將內容切換至執行緒。

  2. 使用 kn 命令將堆疊與框架編號一起傾印 (請參閱 堆疊和傾印記錄

  3. 使用 .frame (設定本機內容) 命令,切換至框架內容。

  4. 使用 dv (顯示區域變數) 命令來檢視區域變數。

注意

您必須使用私用符號來傾印區域變數。

範例︰

此範例會使用 .threadkn.framedv 命令,從堆疊框架傾印區域變數:

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、儲存體、NDIS、圖形、Kernel-Mode Driver Framework (KMDF) ,以及User-Mode Driver Framework (UMDF) 。 如需這些延伸模組的詳細資訊,請參閱 特製化延伸模組。 如需 Windows 偵錯工具的詳細資訊,請參閱 下載並安裝適用于 Windows 的偵錯工具

藉由使用 Windows HLK 對裝置基礎可靠性測試進行疑難排解