Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
WinDbg är ett felsökningsprogram i kernelläge och användarläge som ingår i felsökningsverktyg för Windows. Den här artikeln innehåller övningar som hjälper dig att komma igång med WinDbg som ett felsökningsprogram i kernelläge.
Information om hur du hämtar WinDbg finns i Ladda ned och installera WinDbg Windows-felsökningsprogrammet.
Konfigurera en felsökning i kernelläge
En felsökningsmiljö i kernelläge har vanligtvis två datorer, värddatorn och måldatorn. Felsökningsprogrammet körs på värddatorn och koden som felsöks körs på måldatorn. Värden och målet är anslutna via en felsökningskabel.
Windows-felsökarna stöder följande typer av kablar:
- Ethernet
- USB 3.0
- Seriell (kallas även nullmodem)
För hastighet och tillförlitlighet bör du använda en Ethernet-kabel med en lokal nätverkshubb. Följande diagram illustrerar en värd- och måldator som är ansluten för felsökning med en Ethernet-kabel.
Ett alternativ för äldre versioner av Windows är att använda en direktkabel, till exempel en seriell kabel.
Mer information om hur du konfigurerar värd- och måldatorer finns i Konfigurera felsökning i kernelläge manuellt.
Virtuell maskin – VM
Information om hur du ansluter ett felsökningsprogram till en Hyper-V virtuell dator finns i Konfigurera nätverksfelsökning av en virtuell dator – KDNET.
Upprätta en felsökningssession i kernelläge
När du har ställt in värddatorn och måldatorn samt anslutit dem med en felsökningskabel, kan du inleda en felsökningssession i kernelläge. Följ anvisningarna i samma avsnitt som du använde för att konfigurera. Om du till exempel bestämmer dig för att konfigurera värd- och måldatorer för felsökning via Ethernet kan du hitta instruktioner för att upprätta en felsökningssession i kernelläge i följande artikel:
Kom igång med WinDbg
Öppna WinDbg på värddatorn och upprätta en felsökningssession i kernelläge med måldatorn.
Öppna CHM-filen för felsökningsdokumentationen genom att gå till hjälpmenyn och välja Innehåll. Dokumentationen för felsökningsprogrammet är också tillgänglig online i Felsökningsverktyg för Windows.
När du upprättar en felsökningssession i kernelläge kan WinDbg automatiskt bryta sig in på måldatorn. Om WinDbg inte bryter sig in går du till felsökningsmenyn och väljer Bryt.
På kommandoraden längst ned i WinDbg-fönstret anger du följande kommando:
Utdata ser ut ungefär så här:
Symbol search path is: srv* Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbolsSymbol-sökvägen talar om för WinDbg var den kan leta efter symbolfiler (PDB). Felsökningsprogrammet behöver symbolfiler för att få information om kodmoduler, till exempel funktionsnamn och variabelnamn.
Ange följande kommando, som instruerar WinDbg att göra sin första sökning och inläsning av symbolfiler:
Om du vill se en lista över inlästa moduler anger du följande kommando:
Utdata ser ut ungefär så här:
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) ...Starta måldatorn genom att ange följande kommando:
Om du vill bryta dig in igen går du till felsökningsmenyn och väljer Bryt.
Ange följande kommando för att undersöka
_FILE_OBJECTdatatypen i modulennt:Utdata ser ut ungefär så här:
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 VoidAnge följande kommando för att undersöka några av symbolerna i modulen
nt:Utdata ser ut ungefär så här:
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> ...Ange följande kommando för att placera en brytpunkt på MmCreateProcessAddressSpace:
bu nt! MmCreateProcessAddressSpace
Kontrollera att brytpunkten har angetts genom att ange följande kommando:
Utdata ser ut ungefär så här:
0:000>0: kd> bu nt!MmCreateProcessAddressSpace 0: kd> bl 0 e fffff800`02e03904 0001 (0001) nt!MmCreateProcessAddressSpaceAnge g för att låta måldatorn köras.
Om måldatorn inte bryter sig in i felsökningsprogrammet omedelbart utför du några åtgärder på måldatorn (till exempel öppna Anteckningar). Måldatorn bryter sig in i felsökningsprogrammet när MmCreateProcessAddressSpace anropas. Om du vill se stackspårningen anger du följande kommandon:
Utdata ser ut ungefär så här:
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+0x1dPå menyn Visa väljer du Disassemblator.
På menyn Felsök väljer du Steg över (eller trycker på F10). Ange stegkommandon några gånger till när du tittar på disassembly-fönstret.
Rensa brytpunkten genom att ange följande kommando:
Ange g för att låta måldatorn köras. Om du vill bryta in igen går du till felsökningsmenyn och väljer Bryt eller trycker på CTRL-Break.
Om du vill se en lista över alla processer anger du följande kommando:
Utdata ser ut ungefär så här:
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.exeKopiera adressen till en process och ange följande kommando:
Till exempel:
!process ffffe00000d5290 2Utdata visar trådarna i processen.
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 QueueObjectKopiera adressen till en tråd och ange följande kommando:
Till exempel:
!thread ffffe00000e6d080Utdata visar information om den enskilda tråden.
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 ...Om du vill se alla enhetsnoder i plug and play-enhetsträdet anger du följande kommando:
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) ...Om du vill se enhetsnoderna och deras maskinvaruresurser anger du följande kommando:
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 ...Om du vill se en enhetsnod som har ett tjänstnamn på disken anger du följande kommando:
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) ...Utdata från !devnode 0 1 visar adressen till det fysiska enhetsobjektet (PDO) för noden. Kopiera adressen till ett fysiskt enhetsobjekt (PDO) och ange följande kommando:
Till exempel:
<PdoAddress>!devstack 0xffffe000011596100:000>0: kd> !devstack 0xffffe00001159610 !DevObj !DrvObj !DevExt ObjectName ffffe00001d50040 \Driver\partmgr ffffe00001d50190 ffffe00001d51450 \Driver\disk ffffe00001d515a0 DR0 ffffe00001156e50 \Driver\ACPI ffffe000010d8bf0Om du vill få information om drivrutinen disk.sysanger du följande kommando:
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!ClassGlobalDispatchUtdata för
!drvobjvisar adresser för leveransrutiner. Till exempelCLASSPNP!ClassGlobalDispatch. Om du vill ange och verifiera en brytpunkt påClassGlobalDispatchanger du följande kommandon:bu CLASSPNP! ClassGlobalDispatch
Ange
gför att låta måldatorn köras.Om måldatorn inte bryter sig in i felsökningsprogrammet omedelbart utför du några åtgärder på måldatorn (till exempel öppna Anteckningar och spara en fil). Måldatorn bryter sig in i felsökningsprogrammet när
ClassGlobalDispatchanropas. Om du vill se stackspårningen anger du följande kommandon:Utdata ser ut ungefär så här:
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 ...Om du vill avsluta felsökningssessionen anger du följande kommando:
Sammanfattning av kommandon
- Innehållskommando på hjälpmenyn
- .sympath (Ange symbolsökväg)
- .reload (ladda om modulen)
- x (Granska symboler)
- g (Go)
- dt (visningstyp)
- Kommandot Bryt på Felsökningsmenyn
- lm (Lista inlästa moduler)
- k (Visa stack-backtrace)
- bu (Sätt brytpunkt)
- bl (brytpunktslista)
- bc (Brytpunkt klar)
- Step Into-kommandot på Debug-menyn (F11)
- !process
- !tråd
- !devnode
- !devstack
- !drvobj
- qd (Avsluta och koppla från)