Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Stuurprogrammacontrole genereert bugcontrole 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION met een parameter 1-waarde van 0x62 wanneer een stuurprogramma wordt ontladen zonder eerst al zijn pooltoewijzingen vrij te geven. Niet-vrije geheugentoewijzingen (ook wel geheugenlekken genoemd) zijn een veelvoorkomende oorzaak van lagere prestaties van het besturingssysteem. Deze kunnen de systeemgroepen versnipperen en uiteindelijk systeemcrashes veroorzaken.
Wanneer u een kernelfoutopsporingsprogramma hebt verbonden met een testcomputer waarop Driver Verifier wordt uitgevoerd, breekt Windows in het foutopsporingsprogramma in en geeft een korte beschrijving van de fout weer.
>Foutopsporing van geheugenlekken bij het uitladen van stuurprogramma's
- !analyze gebruiken om informatie over de foutcontrole weer te geven
- Gebruik de extensieopdracht !verifier 3 voor meer informatie over de pooltoewijzingen
- Als u symbolen hebt, kunt u vaststellen waar in de bronbestanden de geheugentoewijzingen zijn opgetreden
- Bekijk het logboek voor geheugentoewijzingen
- Geheugenlekken oplossen
!analyze gebruiken om informatie over de foutcontrole weer te geven
Net als bij een foutcontrole die zich voordoet, is de beste eerste stap het uitvoeren van de opdracht !analyze -v zodra u controle hebt over het foutopsporingsprogramma.
kd> !analyze -v
Connected to Windows 8 9600 x86 compatible target
Loading Kernel Symbols
.................................................................................
Loading User Symbols
.......................
Loading unloaded module list
........
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
A device driver attempting to corrupt the system has been caught. This is
because the driver was specified in the registry as being suspect (by the
administrator) and the kernel has enabled substantial checking of this driver.
If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
be among the most commonly seen crashes.
Arguments:
Arg1: 00000062, A driver has forgotten to free its pool allocations prior to unloading.
Arg2: 9707712c, name of the driver having the issue.
Arg3: 9c1faf70, verifier internal structure with driver information.
Arg4: 00000003, total # of (paged+nonpaged) allocations that weren't freed.
Type !verifier 3 drivername.sys for info on the allocations
that were leaked that caused the bugcheck.
Een foutcontrole 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION met een parameter 1 -waarde (Arg1) van 0x62 wordt als volgt beschreven:
DRIVER_VERIFIER_DETECTED_VIOLATION (C4) Arg1 Arg2 Arg3 Arg4 Cause Driver Verifier vlaggen 0x62 Naam van het stuurprogramma. Totaal gereserveerd aantal toewijzingen dat niet is vrijgemaakt, inclusief zowel geheugensegment- als niet-geheugensegmentpools. Het besturingsprogramma laadt uit zonder eerst zijn pooltoewijzingen vrij te maken. In Windows 8.1 vindt deze foutcontrole ook plaats als het stuurprogramma wordt verwijderd zonder eerst werkitems (IO_WORKITEM) vrij te geven die zijn toegewezen met IoAllocateWorkItem. Een foutcontrole met deze parameter vindt alleen plaats wanneer de optie Pooltracking actief is. Pooltracking opgeven (verifier /flags 0x8). De optie Pooltracking is ingeschakeld met Standaardvlaggen (verifier /standard).
Gebruik de extensieopdracht !verifier 3 voor meer informatie over de pooltoewijzingen
Voor deze specifieke foutcontrole is de informatie in parameter 4 (Arg4) het belangrijkste. Arg4 toont het aantal toewijzingen die niet zijn vrijgemaakt. In de uitvoer van de opdracht !analyze wordt ook de extensieopdracht !verifier-foutopsporingsprogramma weergegeven die u kunt gebruiken om weer te geven wat deze toewijzingen waren. De volledige uitvoer van de opdracht !verifier 3 MyDriver.sys wordt weergegeven in het volgende voorbeeld:
kd> !verifier 3 Mydriver.sys
Verify Flags Level 0x000209bb
STANDARD FLAGS:
[X] (0x00000000) Automatic Checks
[X] (0x00000001) Special pool
[X] (0x00000002) Force IRQL checking
[X] (0x00000008) Pool tracking
[X] (0x00000010) I/O verification
[X] (0x00000020) Deadlock detection
[X] (0x00000080) DMA checking
[X] (0x00000100) Security checks
[X] (0x00000800) Miscellaneous checks
[X] (0x00020000) DDI compliance checking
ADDITIONAL FLAGS:
[ ] (0x00000004) Randomized low resources simulation
[ ] (0x00000200) Force pending I/O requests
[ ] (0x00000400) IRP logging
[ ] (0x00002000) Invariant MDL checking for stack
[ ] (0x00004000) Invariant MDL checking for driver
[ ] (0x00008000) Power framework delay fuzzing
[ ] (0x00040000) Systematic low resources simulation
[ ] (0x00080000) DDI compliance checking (additional)
[ ] (0x00200000) NDIS/WIFI verification
[ ] (0x00800000) Kernel synchronization delay fuzzing
[ ] (0x01000000) VM switch verification
[X] Indicates flag is enabled
Summary of All Verifier Statistics
RaiseIrqls 0x0
AcquireSpinLocks 0x0
Synch Executions 0x0
Trims 0x0
Pool Allocations Attempted 0x2db1a
Pool Allocations Succeeded 0x2db1a
Pool Allocations Succeeded SpecialPool 0x2db1a
Pool Allocations With NO TAG 0x0
Pool Allocations Failed 0x0
Current paged pool allocations 0x0 for 00000000 bytes
Peak paged pool allocations 0x0 for 00000000 bytes
Current nonpaged pool allocations 0x3 for 00001058 bytes
Peak nonpaged pool allocations 0x13 for 0004A4A0 bytes
## Driver Verification List
MODULE: 0x84226b28 MyDriver.sys (Loaded)
Pool Allocation Statistics: ( NonPagedPool / PagedPool )
Current Pool Allocations: ( 0x00000003 / 0x00000000 )
Current Pool Bytes: ( 0x00001058 / 0x00000000 )
Peak Pool Allocations: ( 0x00000013 / 0x00000000 )
Peak Pool Bytes: ( 0x0004A4A0 / 0x00000000 )
Contiguous Memory Bytes: 0x00000000
Peak Contiguous Memory Bytes: 0x00000000
Pool Allocations:
Address Length Tag Caller
---------- ---------- ---- ----------
0x982a8fe0 0x00000020 VMdl 0x9a3bf6ac MyDriver!DeviceControlDispatch
0x8645a000 0x00001008 mdrv 0x9a3bf687 MyDriver!DeviceControlDispatch
0x9a836fd0 0x00000030 Vfwi 0x9a3bf6ed MyDriver!GetNecessaryObjects
Het stuurprogramma, MyDriver.sys, heeft bijvoorbeeld twee geheugentoewijzingen en één I/O-werkitem dat niet correct is vrijgemaakt. Elke vermelding toont het adres van de huidige toewijzing, de grootte, de gebruikte pooltag en het adres in de drivercode waar de aanvraag voor een toewijzing is gedaan. Als er symbolen voor het betreffende stuurprogramma worden geladen, wordt ook de naam van de functie naast het adres van de aanroeper weergegeven.
Van de weergegeven tags is er slechts één (voor de toewijzing op adres 0x8645a000) door het stuurprogramma zelf (mdrv) opgegeven. De tag VMdl wordt gebruikt wanneer een stuurprogramma dat wordt geverifieerd door Driver Verifier IoAllocateMdl aanroept. Op dezelfde manier wordt de tag Vfwi gebruikt wanneer een stuurprogramma dat wordt geverifieerd door Driver Verifier een aanvraag doet om een werkitem toe te wijzen met behulp van IoAllocateWorkItem.
Als u symbolen hebt, kunt u vinden waar in de bronbestanden de geheugentoewijzingen zijn opgetreden
Wanneer symbolen worden geladen voor het stuurprogramma, als deze symbolen de informatie over het regelnummer bevatten, kunt u de lnCallerAddress-opdracht gebruiken om de regel weer te geven waar de aanroep is gedaan. In deze uitvoer wordt ook de offset weergegeven in de functie die de toewijzing heeft gemaakt.
kd> ln 0x9a3bf6ac
d:\coding\wdmdrivers\mydriver\handleioctl.c(50)+0x15
(9a3bf660) MyDriver!DeviceControlDispatch+0x4c | (9a3bf6d0) MyDriver!DeviceControlDispatch
kd> ln 0x9a3bf687
d:\coding\wdmdrivers\mydriver\handleioctl.c(38)+0x12
(9a3bf660) MyDriver!DeviceControlDispatch+0x27 | (9a3bf6d0) MyDriver!DeviceControlDispatch
kd> ln 0x9a3bf6ed
d:\coding\wdmdrivers\mydriver\handleioctl.c(72)+0xa
(9a3bf6d0) MyDriver!GetNecessaryObjects+0x1d | (9a3bf71c) MyDriver!GetNecessaryObjects
Bekijk het logboek voor geheugentoewijzingen
Stuurprogrammacontrole houdt ook een cirkelvormig logboek bij van alle geheugentoewijzingen die zijn gemaakt in kernelruimte wanneer het bijhouden van pools is ingeschakeld. Standaard worden de meest recente toewijzingen van 65.536 (0x10000) bewaard. Als er een nieuwe toewijzing wordt gemaakt, wordt de oudste toewijzing in het logboek overschreven. Als de toewijzingen recentelijk zijn gemaakt vlak voor het vastlopen van het systeem, kan het zijn dat er aanvullende gegevens over de toewijzing beschikbaar zijn dan dat hierboven wordt weergegeven, met name het threadadres en de frames van de kernelstack tijdens de toewijzing.
Dit logboek kan worden geopend met behulp van de opdracht !verifier 0x80AddressOfPoolAllocation. Houd er rekening mee dat hiermee alle toewijzingen en vrijgaves in de log voor dit specifieke adres worden vermeld. Als u de weergave van de logboekgeschiedenis wilt annuleren of stoppen, gebruikt u de sneltoetsen: Ctrl + Break met WinDbg en Ctrl + C met KD.
kd> !verifier 0x80 0x982a8fe0
Log of recent kernel pool Allocate and Free operations:
There are up to 0x10000 entries in the log.
Parsing 0x00010000 log entries, searching for address 0x982a8fe0.
#
Pool block 982a8fe0, Size 00000020, Thread 9c158bc0
81b250cd nt!IovAllocateMdl+0x3d
8060e41d VerifierExt!IoAllocateMdl_internal_wrapper+0x35
81b29388 nt!VerifierIoAllocateMdl+0x22
9a3bf6ac MyDriver!DeviceControlDispatch+0x4c
9a3bf611 MyDriver!NonPNPIRPDispatch0x51
9a3bf05a MyDriver!AllIRPDispatch+0x1a
80611710 VerifierExt!xdv_IRP_MJ_DEVICE_CONTROL_wrapper+0xd0
81b3b635 nt!ViGenericDispatchHandler+0x2d
81b3b784 nt!ViGenericDeviceControl+0x18
81b24b4d nt!IovCallDriver+0x2cc
81703772 nt!IofCallDriver+0x62
8191165e nt!IopSynchronousServiceTail+0x16e
81915518 nt!IopXxxControlFile+0x3e8
kd> !verifier 0x80 0x8645a000
Log of recent kernel pool Allocate and Free operations:
There are up to 0x10000 entries in the log.
Parsing 0x00010000 log entries, searching for address 0x8645a000.
#
Pool block 8645a000, Size 00001000, Thread 9c158bc0
8060ee4f VerifierExt!ExAllocatePoolWithTagPriority_internal_wrapper+0x5b
81b2619e nt!VerifierExAllocatePoolWithTag+0x24
9a3bf687 MyDriver!DeviceControlDispatch+0x27
9a3bf611 MyDriver!NonPNPIRPDispatch0x51
9a3bf05a MyDriver!AllIRPDispatch+0x1a
80611710 VerifierExt!xdv_IRP_MJ_DEVICE_CONTROL_wrapper+0xd0
81b3b635 nt!ViGenericDispatchHandler+0x2d
81b3b784 nt!ViGenericDeviceControl+0x18
81b24b4d nt!IovCallDriver+0x2cc
81703772 nt!IofCallDriver+0x62
8191165e nt!IopSynchronousServiceTail+0x16e
81915518 nt!IopXxxControlFile+0x3e8
81914516 nt!NtDeviceIoControlFile+0x2a
kd> !verifier 0x80 0x9a836fd0
Log of recent kernel pool Allocate and Free operations:
There are up to 0x10000 entries in the log.
Parsing 0x00010000 log entries, searching for address 0x9a836fd0.
#
Pool block 9a836fd0, Size 00000030, Thread 88758740
8151713d nt!IovAllocateWorkItem+0x1b
84a133d9 VerifierExt!IoAllocateWorkItem_internal_wrapper+0x29
8151b3a7 nt!VerifierIoAllocateWorkItem+0x16
9a3bf6ed MyDriver!GetNecessaryObjects+0x1d
9a3bf620 MyDriver!NonPNPIRPDispatch0x51
9a3bf05a MyDriver!AllIRPDispatch+0x1a
84a16710 VerifierExt!xdv_IRP_MJ_DEVICE_CONTROL_wrapper+0xd0
8152d635 nt!ViGenericDispatchHandler+0x2d
8152d784 nt!ViGenericDeviceControl+0x18
81516b4d nt!IovCallDriver+0x2cc
810f5772 nt!IofCallDriver+0x62
8130365e nt!IopSynchronousServiceTail+0x16e
81307518 nt!IopXxxControlFile+0x3e8
Geheugenlekken oplossen
De bugcontrole van de stuurprogrammacontrole is ontworpen om te voorkomen dat de bestuurder kernelgeheugen laat lekken. In elk geval is de juiste oplossing het identificeren van bestaande codepaden waarbij de toegewezen objecten niet worden vrijgemaakt en ervoor zorgen dat ze correct worden vrijgemaakt.
Static Driver Verifier is een hulpprogramma waarmee broncode van Windows-stuurprogramma's wordt gescand en gerapporteerd over mogelijke problemen door de uitoefening van verschillende codepaden te simuleren. Static Driver Verifier is een uitstekend hulpprogramma voor gebruik tijdens de ontwikkeling om dit soort problemen te identificeren.
Zie Voor andere technieken die u kunt gebruiken, inclusief scenario's waarbij Driver Verifier niet betrokken is, het zoeken naar een Kernel-Mode Geheugenlek.
Verwante onderwerpen
Het vinden van een Kernel-Mode-geheugenlek
statische stuurprogrammaverifier
Een bugcontrole afhandelen wanneer stuurprogrammacontrole is ingeschakeld