!검증

!verifier 확장은 드라이버 검증 도구 및 해당 작업의 상태 표시합니다.

드라이버 검증 도구는 Windows에 포함되어 있습니다. 검사 빌드와 무료 빌드 모두에서 작동합니다. 드라이버 검증 도구에 대한 자세한 내용은 드라이버 검증 도구를 참조 하세요.

구문

!verifier [Flags [Image]] 
!verifier 4 [Quantity] 
!verifier 8 [Quantity]  
!verifier 0x40 [Quantity] 
!verifier 0x80 [Quantity]
!verifier 0x80 Address
!verifier 0x100 [Quantity]
!verifier 0x100 Address
!verifier 0x200 [Address]
!verifier 0x400 [Address]
!verifier -disable
!verifier ?

매개 변수

Flags
이 명령의 출력에 표시되는 정보를 지정합니다. 플래그가 4, 8, 0x20, 0x40, 0x80 또는 0x100 값과 같으면 !verifier대한 다시 기본 인수는 해당 값과 연결된 특정 인수에 따라 해석됩니다. 플래그가 다른 값과 같으면 이러한 비트 중 하나 이상이 설정되더라도 FlagsImage 인수만 허용됩니다. 플래그 는 다음 비트의 합계일 수 있으며 기본값은 0입니다.

비트 0(0x1)
확인 중인 모든 드라이버의 이름을 표시합니다. 페이지가 지정되지 않은 풀에서 각 드라이버에 현재 할당된 바이트 수와 페이징된 풀도 표시됩니다.

비트 1(0x2)
풀(풀 크기, 헤더 및 풀 태그) 및 언로드된 드라이버가 남긴 미해결 메모리 할당에 대한 정보를 표시합니다. 비트 0(0x1)도 설정하지 않으면 이 플래그는 효과가 없습니다.

비트 2(0x4)
오류 주입 정보를 표시합니다. 각 할당을 요청하는 코드의 반환 주소, 기호 이름 및 변위가 표시됩니다. 플래그가 정확히 0x4 Quantity 매개 변수가 포함된 경우 이러한 레코드 수를 선택할 수 있습니다. 그렇지 않으면 4개의 레코드가 표시됩니다.

비트 3(0x8)
확인 중인 드라이버에 의해 최근에 변경된 IRQL을 표시합니다. 이전 IRQL, 새 IRQL, 프로세서 및 타임스탬프가 표시됩니다. 플래그가 정확히 0x8 Quantity 매개 변수가 포함된 경우 이러한 레코드 수를 선택할 수 있습니다. 그렇지 않으면 4개의 레코드가 표시됩니다.

경고 64비트 버전의 Windows에서는 IRQL을 발생 또는 낮추는 일부 커널 함수가 내보낸 함수가 아닌 인라인 코드로 구현됩니다. 드라이버 검증 도구는 인라인 코드에서 수행한 IRQL 변경 내용을 보고하지 않으므로 드라이버 검증 도구에서 생성된 IRQL 전환 로그가 불완전할 수 있습니다. 누락된 IRQL 전환 항목의 예는 비고를 참조하세요.

비트 6(0x40)
(Windows Vista 이상) 강제 보류 중인 IRP 로그의 추적을 포함하여 드라이버 검증 도구의 보류 중인 I/O 요청 강제 옵션의 정보를 표시합니다.

Quantity 매개 변수는 표시할 추적 수를 지정합니다. 기본적으로 전체 로그가 표시됩니다.

비트 7(0x80)
(Windows Vista 이상) 커널 풀 할당/무료 로그의 정보를 표시합니다.

Quantity 매개 변수는 표시할 추적 수를 지정합니다. 기본적으로 전체 로그가 표시됩니다.

주소를 지정하면 커널 풀 내의 지정된 주소와 연결된 추적만 할당/사용 가능한 로그가 표시됩니다.

비트 8(0x100)
(Windows Vista 이상) IoAllocateIrp, IoCompleteRequest 및 IoCancelIrp 호출 로그의 정보를 표시합니다.

Quantity 매개 변수는 표시할 추적 수를 지정합니다. 기본적으로 전체 로그가 표시됩니다.

주소를 지정하면 지정된 IRP 주소와 연결된 추적만 표시됩니다.

비트 9(0x200)
(Windows Vista 이상) 중요 지역 로그에 항목을 표시합니다.

주소를 지정하면 지정된 스레드 주소와 연결된 항목만 표시됩니다.

비트 10(0x400)
(Windows Vista 이상) 드라이버 검증 도구에서 현재 감시 중인 취소된 IRP를 표시합니다.

주소를 지정하면 지정된 주소가 있는 IRP만 표시됩니다.

비트 11(0x800)
(Windows 8.1 이상) 체계적인 낮은 리소스 시뮬레이션 옵션을 선택할 때 생성된 오류 주입 로그의 항목을 표시합니다.

이미지
플래그가 사용되고 4, 8 또는 0x10 같지 않은 경우 Image는 드라이버의 이름을 지정합니다. 이미지는 0x1 및 0x2 플래그 값으로 표시되는 정보를 필터링하는 데 사용됩니다. 지정된 드라이버만 고려됩니다. 이 드라이버는 현재 확인되어야 합니다.

수량
플래그가 0x4 정확히 같으면 Quantity는 표시할 오류 주입 레코드 수를 지정합니다. 플래그가 0x8 정확히 같으면 Quantity는 표시할 IRQL 로그 항목 수를 지정합니다. 플래그가 0x40 정확히 같으면 Quantity는 강제 보류 중인 IRP의 로그에서 표시되는 추적 수를 지정합니다. 플래그가 0x80 정확히 같으면 Quantity는 커널 풀 할당/사용 가능한 로그에서 표시되는 추적 수를 지정합니다. 플래그가 0x100 정확히 같으면 Quantity는 IoAllocateIrp, IoCompleteRequest 및 IoCancelIrp 호출 로그에서 표시되는 추적 수를 지정합니다.

-비활성화
디버그 대상에서 현재 드라이버 검증 도구 설정을 지웁니다. 이러한 설정의 삭제는 다시 부팅을 통해 유지되지 않습니다. 성공적으로 부팅하려면 드라이버 검증 도구 설정을 사용하지 않도록 설정해야 하는 경우 중단점을 nt! VerifierInitSystem 및 해당 시점에서 !verifier -disable 명령을 사용합니다.

?
디버거 명령 창에 이 확장에 대한 몇 가지 간단한 도움말 텍스트를 표시합니다.

DLL

Kdexts.dll

추가 정보

자세한 내용은 드라이버 검증 도구를 참조 하세요.

설명

다음 예제에서는 64비트 버전의 Windows에서 IRQL 전환 로그가 항상 완료되지는 않음을 보여 줍니다. 표시되는 두 항목은 프로세서 2에 대한 로그의 연속 항목입니다. 첫 번째 항목은 2에서 0으로 가는 IRQL을 보여줍니다. 두 번째 항목은 2에서 2로 가는 IRQL을 보여줍니다. IRQL이 0에서 2로 발생하는 방법에 대한 정보가 없습니다.

Thread:             fffffa80068c9400
Old irql:           0000000000000002
New irql:           0000000000000000
Processor:          0000000000000002
Time stamp:         0000000000000857

    fffff8800140f12a ndis!ndisNsiGetInterfaceInformation+0x20a
    fffff88001509478 NETIO!NsiGetParameterEx+0x178
    fffff88005f062f2 nsiproxy!NsippGetParameter+0x24a
    fffff88005f086db nsiproxy!NsippDispatchDeviceControl+0xa3
    fffff88005f087a0 nsiproxy!NsippDispatch+0x48

Thread:             fffffa80068c9400
Old irql:           0000000000000002
New irql:           0000000000000002
Processor:          0000000000000002
Time stamp:         0000000000000857

    fffff8800140d48d ndis!ndisReferenceTopMiniportByNameForNsi+0x1ce
    fffff8800140f072 ndis!ndisNsiGetInterfaceInformation+0x152
    fffff88001509478 NETIO!NsiGetParameterEx+0x178
    fffff88005f062f2 nsiproxy!NsippGetParameter+0x24a
    fffff88005f086db nsiproxy!NsippDispatchDeviceControl+0xa3

4, 8 및 0x20, 0x40, 0x80 및 0x100 값은 Flags에 대한 특수 값입니다. 이러한 값을 사용하는 경우 매개 변수 섹션에 나열된 특수 인수를 사용할 수 있으며 표시에는 해당 플래그 값과 관련된 정보만 포함됩니다.

플래그에 대한 다른 값을 사용하는 경우 이러한 비트 중 하나 이상이 설정되더라도 FlagsImage 인수만 허용됩니다. 이 경우 표시된 다른 모든 정보 외에도 !verifier는 풀 할당, IRQL 발생, 스핀 잠금 및 트리밍에 대한 통계와 함께 활성 상태인 드라이버 검증 도구 옵션을 표시합니다.

플래그가 0x20 같으면 CompletionTime, CancelTimeForceCancellation에 지정된 값은 드라이버 검증 도구의 드라이버 중단 확인 옵션에서 사용됩니다. 이러한 새 값은 즉시 적용되며 다음 부팅까지 지속됩니다. 다시 부팅하면 기본값으로 되돌리기.

또한 플래그가 추가 매개 변수를 사용하거나 사용하지 않는 0x20 같으면 드라이버 중단 확인 로그가 인쇄됩니다. 로그 해석에 대한 자세한 내용은 WDK(Windows 드라이버 키트) 설명서의 드라이버 검증 도구 설명서의 드라이버 중단 확인 섹션을 참조하세요.

다음은 Windows 7 컴퓨터의 !verifier 확장 예제입니다.

2: kd> !verifier 0xf

Verify Level 9bb ... enabled options are:
    Special pool
    Special irql
    All pool allocations checked on unload
    Io subsystem checking enabled
    Deadlock detection enabled
    DMA checking enabled
    Security checks enabled
    Miscellaneous checks enabled

Summary of All Verifier Statistics

RaiseIrqls                             0x0
AcquireSpinLocks                       0x362
Synch Executions                       0x0
Trims                                  0xa34a

Pool Allocations Attempted             0x7b058
Pool Allocations Succeeded             0x7b058
Pool Allocations Succeeded SpecialPool 0x7b058
Pool Allocations With NO TAG           0x0
Pool Allocations Failed                0x0
Resource Allocations Failed Deliberately   0x0

Current paged pool allocations         0x1a for 00000950 bytes
Peak paged pool allocations            0x1b for 00000AC4 bytes
Current nonpaged pool allocations      0xe3 for 00046110 bytes
Peak nonpaged pool allocations         0x10f for 00048E40 bytes

Driver Verification List

Entry     State           NonPagedPool   PagedPool   Module

fffffa8003b6f670 Loaded           000000a0       00000854    videoprt.sys

Current Pool Allocations  00000002    00000013
Current Pool Bytes        000000a0    00000854
Peak Pool Allocations     00000006    00000014
Peak Pool Bytes           000008c0    000009c8

PoolAddress  SizeInBytes    Tag       CallersAddress
fffff9800157efc0     0x0000003c     Vprt      fffff88002c62963
fffff9800146afc0     0x00000034     Vprt      fffff88002c62963
fffff980015bafe0     0x00000018     Vprt      fffff88002c628f7
...

fffffa8003b6f620 Loaded           00046070       000000fc    usbport.sys

Current Pool Allocations  000000e1    00000007
Current Pool Bytes        00046070    000000fc
Peak Pool Allocations     0000010d    0000000a
Peak Pool Bytes           00048da0    00000254

PoolAddress  SizeInBytes    Tag       CallersAddress
fffff98003a38fc0     0x00000038     usbp      fffff88004215e34
fffff98003a2cfc0     0x00000038     usbp      fffff88004215e34
fffff9800415efc0     0x00000038     usbp      fffff88004215e34
...

----------------------------------------------- 
Fault injection trace log                       
----------------------------------------------- 

Driver Verifier didn't inject any faults.

----------------------------------------------- 
Track irql trace log                            
----------------------------------------------- 

Displaying most recent 0x0000000000000004 entries from the IRQL transition log.
There are up to 0x100 entries in the log.

Thread:             fffff80002bf8c40
Old irql:           0000000000000002
New irql:           0000000000000002
Processor:          0000000000000000
Time stamp:         000000000000495e

    fffff8800420f2ca USBPORT!USBPORT_DM_IoTimerDpc+0x9a
    fffff80002a5b5bf nt!IopTimerDispatch+0x132
    fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66
    fffff80002a7bdd6 nt!KiProcessExpiredTimerList+0xc6
    fffff80002a7c4be nt!KiTimerExpiration+0x1be

Thread:             fffff80002bf8c40
Old irql:           0000000000000002
New irql:           0000000000000002
Processor:          0000000000000000
Time stamp:         000000000000495e

    fffff88004205f3a USBPORT!USBPORT_AcquireEpListLock+0x2e
    fffff880042172df USBPORT!USBPORT_Core_TimeoutAllTransfers+0x1f
    fffff8800420f2ca USBPORT!USBPORT_DM_IoTimerDpc+0x9a
    fffff80002a5b5bf nt!IopTimerDispatch+0x132
    fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66

Thread:             fffff80002bf8c40
Old irql:           0000000000000002
New irql:           0000000000000002
Processor:          0000000000000000
Time stamp:         000000000000495e

    fffff88004201694 USBPORT!MPf_CheckController+0x4c
    fffff8800420f26a USBPORT!USBPORT_DM_IoTimerDpc+0x3a
    fffff80002a5b5bf nt!IopTimerDispatch+0x132
    fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66
    fffff80002a7bdd6 nt!KiProcessExpiredTimerList+0xc6

Thread:             fffff80002bf8c40
Old irql:           0000000000000002
New irql:           0000000000000002
Processor:          0000000000000000
Time stamp:         000000000000495e

    fffff8800420167c USBPORT!MPf_CheckController+0x34
    fffff8800420f26a USBPORT!USBPORT_DM_IoTimerDpc+0x3a
    fffff80002a5b5bf nt!IopTimerDispatch+0x132
    fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66
    fffff80002a7bdd6 nt!KiProcessExpiredTimerList+0xc6

다음은 비트 7이 켜져 있고 주소가 지정된 Windows Vista 컴퓨터의 !verifier 확장 예제입니다.

0: kd> !verifier 80 a2b1cf20
# Parsing 00004000 array entries, searching for address a2b1cf20.

Pool block a2b1ce98, Size 00000168, Thread a2b1ce98
808f1be6 ndis!ndisFreeToNPagedPool+0x39
808f11c1 ndis!ndisPplFree+0x47
808f100f ndis!NdisFreeNetBufferList+0x3b
8088db41 NETIO!NetioFreeNetBufferAndNetBufferList+0xe
8c588d68 tcpip!UdpEndSendMessages+0xdf
8c588cb5 tcpip!UdpSendMessagesDatagramsComplete+0x22
8088d622 NETIO!NetioDereferenceNetBufferListChain+0xcf
8c5954ea tcpip!FlSendNetBufferListChainComplete+0x1c
809b2370 ndis!ndisMSendCompleteNetBufferListsInternal+0x67
808f1781 ndis!NdisFSendNetBufferListsComplete+0x1a
8c04c68e pacer!PcFilterSendNetBufferListsComplete+0xb2
809b230c ndis!NdisMSendNetBufferListsComplete+0x70
# 8ac4a8ba test1!HandleCompletedTxPacket+0xea

Pool block a2b1ce98, Size 00000164, Thread a2b1ce98
822af87f nt!VerifierExAllocatePoolWithTagPriority+0x5d
808f1c88 ndis!ndisAllocateFromNPagedPool+0x1d
808f11f3 ndis!ndisPplAllocate+0x60
808f1257 ndis!NdisAllocateNetBufferList+0x26
80890933 NETIO!NetioAllocateAndReferenceNetBufferListNetBufferMdlAndData+0x14
8c5889c2 tcpip!UdpSendMessages+0x503
8c05c565 afd!AfdTLSendMessages+0x27
8c07a087 afd!AfdTLFastDgramSend+0x7d
8c079f82 afd!AfdFastDatagramSend+0x5ae
8c06f3ea afd!AfdFastIoDeviceControl+0x3c1
8217474f nt!IopXxxControlFile+0x268
821797a1 nt!NtDeviceIoControlFile+0x2a
8204d16a nt!KiFastCallEntry+0x127