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.
WinDbg is een kernelmodus en foutopsporingsprogramma voor gebruikersmodus dat is opgenomen in Hulpprogramma's voor foutopsporing voor Windows. Dit artikel bevat oefeningen om u te helpen aan de slag te gaan met WinDbg als foutopsporingsprogramma in de kernelmodus.
Instellen van foutopsporing in kernel-modus
Een foutopsporingsomgeving in de kernelmodus heeft doorgaans twee computers, de hostcomputer en de doelcomputer. Het foutopsporingsprogramma wordt uitgevoerd op de hostcomputer en de code die wordt opgespoord, wordt uitgevoerd op de doelcomputer. De host en het doel zijn verbonden met een foutopsporingskabel.
De Windows-foutopsporingsprogramma's ondersteunen de volgende typen kabels:
- Ethernet
- USB 3.0
- Serieel (ook wel null-modem genoemd)
Voor snelheid en betrouwbaarheid moet u een Ethernet-kabel gebruiken met een lokale netwerkhub. In het volgende diagram ziet u een host- en doelcomputer die is verbonden voor foutopsporing met een Ethernet-kabel.
Een optie voor oudere versies van Windows is het gebruik van een directe kabel, zoals een seriële kabel.
Zie Foutopsporing in kernelmodus handmatig instellen voor meer informatie over het instellen van de host- en doelcomputers.
Virtuele machine - VM
Zie Het instellen van netwerkopsporing van een virtuele machine - KDNET voor informatie over het verbinden van een foutopsporingsprogramma met een Hyper-V virtuele machine.
Een foutopsporingssessie voor kernelmodus tot stand brengen
Nadat u uw host en doelcomputer hebt ingesteld en deze hebt verbonden met een foutopsporingskabel, kunt u een foutopsporingssessie in de kernelmodus tot stand brengen. Volg de instructies in hetzelfde onderwerp dat u hebt gebruikt voor het instellen. Als u bijvoorbeeld besluit om uw host- en doelcomputers in te stellen voor foutopsporing via Ethernet, vindt u instructies voor het instellen van een kernelmodusfoutsessie in het volgende artikel:
Aan de slag met WinDbg
Open WinDbg op de hostcomputer en stel een foutopsporingssessie in de kernelmodus in met de doelcomputer.
Als u het CHM-bestand met foutopsporingsprogrammadocumentatie wilt openen, gaat u naar het menu Help en selecteert u Inhoud. De documentatie voor foutopsporingsprogramma's is ook online beschikbaar in Hulpprogramma's voor foutopsporing voor Windows.
Wanneer u een foutopsporingssessie in de kernelmodus tot stand brengt, kan WinDbg automatisch inbreken op de doelcomputer. Als WinDbg niet inbreekt, gaat u naar het menu Foutopsporing en selecteert u Pauzeren.
Voer in de opdrachtregel onder aan het WinDbg-venster de volgende opdracht in:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
Symbol search path is: srv* Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbolsHet zoekpad voor symbolen vertelt WinDbg waar moet worden gezocht naar symboolbestanden (PDB). Het foutopsporingsprogramma heeft symboolbestanden nodig om informatie te verkrijgen over codemodules, zoals functienamen en variabelenamen.
Voer de volgende opdracht in, waarmee WinDbg het eerste vinden en laden van symboolbestanden moet uitvoeren:
Voer de volgende opdracht in om een lijst met geladen modules weer te geven:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000>3: kd> lm start end module name fffff800`00000000 fffff800`00088000 CI (deferred) ... fffff800`01143000 fffff800`01151000 BasicRender (deferred) fffff800`01151000 fffff800`01163000 BasicDisplay (deferred) ... fffff800`02a0e000 fffff800`03191000 nt (pdb symbols) C:\...\ntkrnlmp.pdb fffff800`03191000 fffff800`03200000 hal (deferred) ...Voer de volgende opdracht in om de doelcomputer te starten:
Als u de uitvoering opnieuw wilt onderbreken, gaat u naar het menu Foutopsporing en selecteert u Onderbreken.
Voer de volgende opdracht in om het
_FILE_OBJECTgegevenstype in dentmodule te onderzoeken:De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000>0: kd> dt nt!_FILE_OBJECT +0x000 Type : Int2B +0x002 Size : Int2B +0x008 DeviceObject : Ptr64 _DEVICE_OBJECT +0x010 Vpb : Ptr64 _VPB ... +0x0c0 IrpList : _LIST_ENTRY +0x0d0 FileObjectExtension : Ptr64 VoidVoer de volgende opdracht in om enkele van de symbolen in de
ntmodule te onderzoeken:De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000>0: kd> x nt!*CreateProcess* fffff800`030821cc nt!ViCreateProcessCallbackInternal (<no parameter info>) ... fffff800`02e03904 nt!MmCreateProcessAddressSpace (<no parameter info>) fffff800`02cece00 nt!PspCreateProcessNotifyRoutine = <no type information> ...Voer de volgende opdracht in om een onderbrekingspunt te plaatsen bij MmCreateProcessAddressSpace:
bu nt!MmCreateProcessAddressSpace
Voer de volgende opdracht in om te controleren of het onderbrekingspunt is ingesteld:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000>0: kd> bu nt!MmCreateProcessAddressSpace 0: kd> bl 0 e fffff800`02e03904 0001 (0001) nt!MmCreateProcessAddressSpaceVoer g in om de doelcomputer te laten draaien.
Als de doelcomputer niet onmiddellijk overschakelt naar het foutopsporingsprogramma, voert u een paar handelingen uit op de doelcomputer (bijvoorbeeld kladblok openen). De doelcomputer schakelt over naar de debugger wanneer MmCreateProcessAddressSpace wordt aangeroepen. Voer de volgende commando's in om de stacktrace te zien.
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000>2: kd> k Child-SP RetAddr Call Site ffffd000`224b4c88 fffff800`02d96834 nt!MmCreateProcessAddressSpace ffffd000`224b4c90 fffff800`02dfef17 nt!PspAllocateProcess+0x5d4 ffffd000`224b5060 fffff800`02b698b3 nt!NtCreateUserProcess+0x55b ... 000000d7`4167fbb0 00007ffd`14b064ad KERNEL32!BaseThreadInitThunk+0xd 000000d7`4167fbe0 00000000`00000000 ntdll!RtlUserThreadStart+0x1dSelecteer In het menu Beeld de optie Demontage.
Selecteer Stap over (of druk op F10) in het menu Foutopsporing. Voer nog een paar keer stapopdrachten in terwijl u het venster Demontage bekijkt.
Wis uw onderbrekingspunt door het volgende commando in te voeren:
Voer g in om de doelcomputer te laten draaien. Om opnieuw te onderbreken, gaat u naar het menu Foutopsporing en selecteert u Onderbreken of drukt u op Ctrl-Onderbreken.
Voer de volgende opdracht in om een lijst met alle processen weer te geven:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000>0: kd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS ffffe000002287c0 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 001aa000 ObjectTable: ffffc00000003000 HandleCount: <Data Not Accessible> Image: System PROCESS ffffe00001e5a900 SessionId: none Cid: 0124 Peb: 7ff7809df000 ParentCid: 0004 DirBase: 100595000 ObjectTable: ffffc000002c5680 HandleCount: <Data Not Accessible> Image: smss.exe ... PROCESS ffffe00000d52900 SessionId: 1 Cid: 0910 Peb: 7ff669b8e000 ParentCid: 0a98 DirBase: 3fdba000 ObjectTable: ffffc00007bfd540 HandleCount: <Data Not Accessible> Image: explorer.exeKopieer het adres van één proces en voer de volgende opdracht in:
Bijvoorbeeld:
!process ffffe00000d5290 2De uitvoer toont de threads in het proces.
0:000>0:000>0: kd> !process ffffe00000d52900 2 PROCESS ffffe00000d52900 SessionId: 1 Cid: 0910 Peb: 7ff669b8e000 ParentCid: 0a98 DirBase: 3fdba000 ObjectTable: ffffc00007bfd540 HandleCount: Image: explorer.exe THREAD ffffe00000a0d880 Cid 0910.090c Teb: 00007ff669b8c000 ffffe00000d57700 SynchronizationEvent THREAD ffffe00000e48880 Cid 0910.0ad8 Teb: 00007ff669b8a000 ffffe00000d8e230 NotificationEvent ffffe00000cf6870 Semaphore Limit 0xffff ffffe000039c48c0 SynchronizationEvent ... THREAD ffffe00000e6d080 Cid 0910.0cc0 Teb: 00007ff669a10000 ffffe0000089a300 QueueObjectKopieer het adres van één thread en voer de volgende opdracht in:
Bijvoorbeeld:
!thread ffffe00000e6d080De uitvoer toont informatie over de specifieke thread.
0: kd> !thread ffffe00000e6d080 THREAD ffffe00000e6d080 Cid 0910.0cc0 Teb: 00007ff669a10000 Win32Thread: 0000000000000000 WAIT: ... ffffe0000089a300 QueueObject Not impersonating DeviceMap ffffc000034e7840 Owning Process ffffe00000d52900 Image: explorer.exe Attached Process N/A Image: N/A Wait Start TickCount 13777 Ticks: 2 (0:00:00:00.031) Context Switch Count 2 IdealProcessor: 1 UserTime 00:00:00.000 KernelTime 00:00:00.000 Win32 Start Address ntdll!TppWorkerThread (0x00007ffd14ab2850) Stack Init ffffd00021bf1dd0 Current ffffd00021bf1580 Base ffffd00021bf2000 Limit ffffd00021bec000 Call 0 Priority 13 BasePriority 13 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5 ...Als u alle apparaatknooppunten in de plug en play-apparaatstructuur wilt zien, voert u de volgende opdracht in:
0:000>0: kd> !devnode 0 1 Dumping IopRootDeviceNode (= 0xffffe000002dbd30) DevNode 0xffffe000002dbd30 for PDO 0xffffe000002dc9e0 InstancePath is "HTREE\ROOT\0" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe000002d9d30 for PDO 0xffffe000002daa40 InstancePath is "ROOT\volmgr\0000" ServiceName is "volmgr" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe00001d49290 for PDO 0xffffe000002a9a90 InstancePath is "STORAGE\Volume\{3007dfd3-df8d-11e3-824c-806e6f6e6963}#0000000000100000" ServiceName is "volsnap" TargetDeviceNotify List - f 0xffffc0000031b520 b 0xffffc0000008d0f0 State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) ...Voer de volgende opdracht in om de apparaatknooppunten en de bijbehorende hardwarebronnen weer te geven:
0:000>... DevNode 0xffffe000010fa770 for PDO 0xffffe000010c2060 InstancePath is "PCI\VEN_8086&DEV_2937&SUBSYS_2819103C&REV_02\3&33fd14ca&0&D0" ServiceName is "usbuhci" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) TranslatedResourceList at 0xffffc00003c78b00 Version 1.1 Interface 0x5 Bus #0 Entry 0 - Port (0x1) Device Exclusive (0x1) Flags (0x131) - PORT_MEMORY PORT_IO 16_BIT_DECODE POSITIVE_DECODE Range starts at 0x3120 for 0x20 bytes Entry 1 - DevicePrivate (0x81) Device Exclusive (0x1) Flags (0000) - Data - {0x00000001, 0x00000004, 0000000000} Entry 2 - Interrupt (0x2) Shared (0x3) Flags (0000) - LEVEL_SENSITIVE Level 0x8, Vector 0x81, Group 0, Affinity 0xf ...Als u een apparaatknooppunt met een servicenaam van de schijf wilt zien, voert u de volgende opdracht in:
0: kd> !devnode 0 1 disk Dumping IopRootDeviceNode (= 0xffffe000002dbd30) DevNode 0xffffe0000114fd30 for PDO 0xffffe00001159610 InstancePath is "IDE\DiskST3250820AS_____________________________3.CHL___\5&14544e82&0&0.0.0" ServiceName is "disk" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) ...In de uitvoer van !devnode 0 1 wordt het adres van het fysieke apparaatobject (PDO) voor het knooppunt weergegeven. Kopieer het adres van een fysiek apparaatobject (PDO) en voer de volgende opdracht in:
Bijvoorbeeld:
<PdoAddress>!devstack 0xffffe000011596100:000>0: kd> !devstack 0xffffe00001159610 !DevObj !DrvObj !DevExt ObjectName ffffe00001d50040 \Driver\partmgr ffffe00001d50190 ffffe00001d51450 \Driver\disk ffffe00001d515a0 DR0 ffffe00001156e50 \Driver\ACPI ffffe000010d8bf0Voer de volgende opdracht in om informatie over het stuurprogramma disk.sysop te halen:
0:000>0: kd> !drvobj disk 2 Driver object (ffffe00001d52680) is for: \Driver\disk DriverEntry: fffff800006b1270 disk!GsDriverEntry DriverStartIo: 00000000 DriverUnload: fffff800010b0b5c CLASSPNP!ClassUnload AddDevice: fffff800010aa110 CLASSPNP!ClassAddDevice Dispatch routines: [00] IRP_MJ_CREATE fffff8000106d160 CLASSPNP!ClassGlobalDispatch [01] IRP_MJ_CREATE_NAMED_PIPE fffff80002b0ab24 nt!IopInvalidDeviceRequest [02] IRP_MJ_CLOSE fffff8000106d160 CLASSPNP!ClassGlobalDispatch [03] IRP_MJ_READ fffff8000106d160 CLASSPNP!ClassGlobalDispatch ... [1b] IRP_MJ_PNP fffff8000106d160 CLASSPNP!ClassGlobalDispatchDe uitvoer van
!drvobjtoont adressen van verzendroutines. Bijvoorbeeld:CLASSPNP!ClassGlobalDispatch. Voer de volgende opdrachten in om een onderbrekingspunt inClassGlobalDispatchte stellen en te controleren:bu CLASSPNP!ClassGlobalDispatch
Voer
gin om een proces op de doelcomputer uit te voeren.Als de doelcomputer niet onmiddellijk in het foutopsporingsprogramma inbreekt, voert u een paar acties uit op de doelcomputer (open Kladblok bijvoorbeeld en sla een bestand op). De doelcomputer zal het foutopsporingsprogramma starten als
ClassGlobalDispatchwordt aangeroepen. Voer de volgende commando's in om de stacktrace te bekijken.De uitvoer is vergelijkbaar met het volgende voorbeeld:
2: kd> k Child-SP RetAddr Call Site ffffd000`21d06cf8 fffff800`0056c14e CLASSPNP!ClassGlobalDispatch ffffd000`21d06d00 fffff800`00f2c31d volmgr!VmReadWrite+0x13e ffffd000`21d06d40 fffff800`0064515d fvevol!FveFilterRundownReadWrite+0x28d ffffd000`21d06e20 fffff800`0064578b rdyboost!SmdProcessReadWrite+0x14d ffffd000`21d06ef0 fffff800`00fb06ad rdyboost!SmdDispatchReadWrite+0x8b ffffd000`21d06f20 fffff800`0085cef5 volsnap!VolSnapReadFilter+0x5d ffffd000`21d06f50 fffff800`02b619f7 Ntfs!NtfsStorageDriverCallout+0x16 ...Als u de foutopsporingssessie wilt beëindigen, voert u de volgende opdracht in:
Samenvatting van opdrachten
- Opdracht Inhoud in het Menu Help
- .sympath (symbolenpad instellen)
- .reload (Herlaad module)
- x (Symbolen onderzoeken)
- g (Go)
- dt (weergavetype)
- Break-opdracht in het menu Debuggen
- lm (geladen modules weergeven)
- k (Backtrace van weergavestack)
- bu (onderbrekingspunt instellen)
- bl (onderbrekingspuntlijst)
- bc (breakpunt wissen)
- Stap in opdracht in het menu Foutopsporing (F11)
- !proces
- !thread
- !devnode
- !devstack
- !drvobj
- qd (Afsluiten en loskoppelen)