Felsöka Windows-drivrutiner steg för steg-labb (ekokärnläge)
Det här labbet introducerar WinDbg-kernelfelsökaren. Du använder WinDbg för att felsöka exempeldrivrutinskoden för ekokärnläge.
Labbmål
Det här labbet innehåller övningar som introducerar felsökningsverktygen, lär ut vanliga felsökningskommandon, illustrerar användningen av brytpunkter och visar hur du använder felsökningstilläggen.
I den här labbuppgiften använder du en live-kernel-felsökningsanslutning för att utforska följande åtgärder:
- Använda Windows-felsökningskommandon
- Använda standardkommandon (anropsstackar, variabler, trådar, IRQL)
- Använda avancerade felsökningskommandon för drivrutiner (!kommandon)
- Använda symboler
- Ange brytpunkter i live-felsökning
- Visa anropsstackar
- Visa Plug and Play-enhetsträdet
- Arbeta med tråd- och processkontext
Felsökning av användar- och kärnläge
När du arbetar med Windows-felsökningsprogrammet kan du göra två typer av felsökning:
Användarläge – Program och undersystem körs på datorn i användarläge. Processer som körs i användarläge gör det i sina egna virtuella adressutrymmen. De är begränsade från att få direkt åtkomst till många delar av systemet, inklusive systemmaskinvara, minne som inte allokeras för deras användning och andra delar av systemet som kan äventyra systemets integritet. Eftersom processer som körs i användarläge är effektivt isolerade från systemet och andra processer i användarläge kan de inte störa dessa resurser.
kernelläge – Operativsystemet och privilegierade program körs i kernelläge. Kernel-lägeskod har behörighet att komma åt alla delar av systemet. Den är inte begränsad som kod i användarläge. Den kan få åtkomst till alla delar av andra processer som körs i användarläge eller kernelläge. Mycket av kärnfunktionerna i operativsystemet och många drivrutiner för maskinvaruenheter körs i kernelläge.
Den här övningen beskriver felsökningskommandon som används ofta vid felsökning i både användarläge och kernelläge. Övningen omfattar även felsökningstillägg, som ibland kallas "bang" !-kommandon, som används för felsökning i kernelläge.
Labbkonfiguration
Du behöver följande maskinvara för att slutföra labbet:
- En bärbar dator eller stationär dator (värd) som kör Windows 10
- En andra bärbar dator eller stationär dator (mål) som kör Windows 10
- En nätverkshubb eller router och nätverkskablar för att ansluta de två datorerna
- Åtkomst till Internet för att ladda ned symbolfiler
Du behöver följande programvara för att slutföra labbet:
- Visual Studio
- Windows Software Development Kit (SDK) för Windows 10
- Windows Driver Kit (WDK) för Windows 10
- Exempelechodrivrutinen för Windows 10
Labbet har följande avsnitt:
- Anslut till en WinDbg-session i kernelläge
- felsökningskommandon och -tekniker i kärnläge
- Ladda ned och kompilera KMDF-ekodrivrutinen
- Installera ekodrivrutinsexemplet på målsystemet
- Använd WinDbg för att visa information om drivrutinen
- Visa information om enhetshierarki för Plug and Play-enhet
- Arbeta med brytpunkter och källkod
- Visa variabler och anropsstackar
- Visa processer och trådar
- IRQL, registrerar och avslutar WinDbg-sessionen
- Windows-felsökningsresurser
Ansluta till en WinDbg-session i kernelläge
I det här avsnittet konfigurerar du nätverksfelsökning på värd- och målsystemet.
Datorerna i den här labbuppgiften måste konfigureras för att använda en Ethernet-nätverksanslutning för kernel-felsökning.
Det här labbet använder två datorer. Windows-felsökningsprogrammet körs på värdsystemet , och ekodrivrutinen för Kernel Mode Driver Framework (KMDF) körs på målsystemet .
Använd en nätverkshubb eller router och nätverkskablar för att ansluta de två datorerna.
Om du vill arbeta med program i kernelläge och använda WinDbg rekommenderar vi att du använder KDNET via Ethernet-transport. Information om hur du använder Ethernet-transportprotokollet finns i Komma igång med WinDbg (kernelläge). Mer information om hur du konfigurerar måldatorn finns i Förbereda en dator för manuell drivrutinsdistribution och Konfigurera KDNET-nätverkskärnfelsökning automatiskt.
Konfigurera felsökning i kernelläge med hjälp av Ethernet
Så här aktiverar du felsökning i kernelläge i målsystemet:
Öppna kommandotolken i värdsystemet och ange ipconfig för att fastställa dess IPv4-adress.
Windows IP Configuration Ethernet adapter Ethernet: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::c8b6:db13:d1e8:b13b%3 Autoconfiguration IPv4 Address. . : 169.182.1.1 Subnet Mask . . . . . . . . . . . : 255.255.0.0 Default Gateway . . . . . . . . . :
Registrera värdsystemets IP-adress: ______________________________________
Öppna kommandotolken i målsystemet och använd kommandot
ping
för att bekräfta nätverksanslutningen mellan de två systemen.ping 169.182.1.1
Använd den faktiska IP-adressen för värdsystemet som du registrerade i stället för 169.182.1.1 som visas i exempelutdata.
Pinging 169.182.1.1 with 32 bytes of data: Reply from 169.182.1.1: bytes=32 time=1ms TTL=255 Reply from 169.182.1.1: bytes=32 time<1ms TTL=255 Reply from 169.182.1.1: bytes=32 time<1ms TTL=255 Reply from 169.182.1.1: bytes=32 time<1ms TTL=255 Ping statistics for 169.182.1.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 1ms, Average = 0ms
Aktivera felsökning i kernelläge i målsystemet genom att utföra följande steg.
Viktig
Innan du använder BCDEdit för att ändra startinformationen kan du tillfälligt behöva inaktivera Windows-säkerhetsfunktioner som BitLocker och Säker start på testdatorn. Återaktivera dessa säkerhetsfunktioner när testningen är klar. Hantera testdatorn på rätt sätt när säkerhetsfunktionerna är inaktiverade. Säker start inaktiveras vanligtvis i UEFI. Om du vill komma åt UEFI-inställningen använder du System, Recovery, Advanced start-up. Vid omstart väljer du Felsöka, Avancerade alternativ, UEFI-inställningar för inbyggd programvara. Var försiktig, eftersom fel inställning av UEFI-alternativ eller inaktivering av BitLocker kan göra systemet obrukbart.
Öppna ett kommandotolksfönster som administratör på måldatorn. Ange det här kommandot för att aktivera felsökning:
bcdedit /set {default} DEBUG YES
Ange det här kommandot för att aktivera testsignering:
bcdedit /set TESTSIGNING ON
Ange det här kommandot för att ange IP-adressen för värdsystemet. Använd IP-adressen för värdsystemet som du registrerade tidigare, inte den som visas.
bcdedit /dbgsettings net hostip:192.168.1.1 port:50000 key:2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
Varning
Om du vill öka säkerheten för anslutningen och minska risken för slumpmässiga anslutningsbegäranden för klientfelsökning använder du en automatiskt genererad slumpmässig nyckel. Mer information finns i Konfigurera KDNET-nätverkskärnfelsökning automatiskt.
Ange det här kommandot för att bekräfta att värdena för
dbgsettings
har angetts korrekt:bcdedit /dbgsettings
key 2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p debugtype NET hostip 169.168.1.1 port 50000 dhcp Yes The operation completed successfully.
Not
Om du får ett meddelande från brandväggen och vill använda felsökningsprogrammet markerar du alla tre rutorna.
Öppna kommandotolken som administratör på värddatorn. Det här labbet använder x64-versionen av WinDbg.exe från Windows Driver Kit (WDK) som installerades som en del av Windows Kit-installationen. Ändra till windbg-standardkatalogen. Standardplatsen visas nedan.
cd C:\Program Files(x86)\Windows Kits\10\Debuggers\x64
Denna laboration förutsätter att båda datorerna kör en 64-bitarsversion av Windows, både på målmaskinen och värddatorn. Om så inte är fallet, är det bäst att använda samma bitness av verktyg på den värddator som måldatorn använder. Om målet kör 32-bitars Windows, till exempel, kör du en 32-bitarsversion av felsökningsprogrammet på värddatorn. Mer information finns i Välja 32-bitars eller 64-bitars felsökningsverktyg.
Öppna WinDbg med fjärranvändarfelsökning med hjälp av följande kommando. Värdena för nyckeln och porten matchar de värden som du angav tidigare med BCDEdit på måldatorn.
WinDbg –k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
Starta om målsystemet.
Om en minut eller två ska felsökningsutdata visas i värdsystemet.
Microsoft (R) Windows Debugger Version 10.0.17074.1002 AMD64 Copyright (c) Microsoft Corporation. All rights reserved. Using NET for debugging Opened WinSock 2.0 Waiting to reconnect... Connected to target 169.182.1.1 on port 50005 on local IP 169.182.1.2 You can get the target MAC address by running .kdtargetmac command. Connected to Windows 10 16299 x64 target at (Wed Feb 28 17:16:23.051 2018 (UTC - 8:00)), ptr64 TRUE Kernel Debugger connection established. (Initial Breakpoint requested) Symbol search path is: srv* Executable search path is: Windows 10 Kernel Version 16299 MP (4 procs) Free x64 Product: WinNt, suite: TerminalServer SingleUserTS Built by: 16299.15.amd64fre.rs3_release.170928-1534 Machine Name: Kernel base = 0xfffff800`9540d000 PsLoadedModuleList = 0xfffff800`95774110 Debug session time: Wed Feb 28 17:16:23.816 2018 (UTC - 8:00) System Uptime: 0 days 0:00:20.534
Felsökningskommandofönstret är det primära informationsfönstret för felsökning i WinDbg. Du kan ange felsökningskommandon och visa kommandoutdata i det här fönstret.
Felsökningskommandofönstret är uppdelat i två fönsterrutor. Ange kommandon i den mindre rutan, som är kommandoinmatningsfönstret längst ned i fönstret, och visa kommandoutdata i det större fönstret längst upp i fönstret.
I kommandoinmatningsfönstret använder du tangenterna Uppåtpil och Nedåtpil för att bläddra igenom kommandohistoriken. När ett kommando visas kan du redigera det eller trycka på Retur för att köra kommandot.
Felsökningskommandon och tekniker i kernelläge
I det här avsnittet använder du felsökningskommandon för att visa information om målsystemet.
Vissa felsökningskommandon visar text med hjälp av DML (Debugger Markup Language) som du kan välja för att snabbt samla in mer information.
I värdsystemet använder du Ctrl+Scroll Lock i WinDBg för att bryta sig in i koden som körs på målsystemet. Det kan ta lite tid för målsystemet att svara.
Ange följande kommando för att aktivera DML i felsökningskommandofönstret:
0: kd> .prefer_dml 1 DML versions of commands on by default
Du kan komma åt referenskommandohjälpen med hjälp av kommandot
.hh
. Ange följande kommando för att visa kommandoreferenshjälpen för.prefer_dml
:0: kd> .hh .prefer_dml
Felsökningshjälpfilen visar hjälp för kommandot
.prefer_dml
.Om du vill visa detaljerad versionsinformation i målsystemet anger du kommandot vertarget (Visa måldatorversion) i WinDbg-fönstret:
0: kd> vertarget Windows 10 Kernel Version 9926 MP (4 procs) Free x64 Product: WinNt, suite: TerminalServer SingleUserTS Built by: 9926.0.amd64fre.fbl_awesome1501.150119-1648 Machine Name: "" Kernel base = 0xfffff801`8d283000 PsLoadedModuleList = 0xfffff801`8d58aef0 Debug session time: Fri Feb 20 10:15:17.807 2015 (UTC - 8:00) System Uptime: 0 days 01:31:58.931
Om du vill kontrollera att du arbetar med rätt process i kernelläge anger du kommandot lm (List Loaded Modules) i WinDbg-fönstret för att visa de inlästa modulerna:
0: Kd> lm start end module name fffff801`09200000 fffff801`0925f000 volmgrx (no symbols) fffff801`09261000 fffff801`092de000 mcupdate_GenuineIntel (no symbols) fffff801`092de000 fffff801`092ec000 werkernel (export symbols) werkernel.sys fffff801`092ec000 fffff801`0934d000 CLFS (export symbols) CLFS.SYS fffff801`0934d000 fffff801`0936f000 tm (export symbols) tm.sys fffff801`0936f000 fffff801`09384000 PSHED (export symbols) PSHED.dll fffff801`09384000 fffff801`0938e000 BOOTVID (export symbols) BOOTVID.dll fffff801`0938e000 fffff801`093f7000 spaceport (no symbols) fffff801`09400000 fffff801`094cf000 Wdf01000 (no symbols) fffff801`094d9000 fffff801`09561000 CI (export symbols) CI.dll ...
Utdata som utelämnats anges med "..." i det här labbet.
För att begära utförlig information om en specifik modul, använd alternativet
v
.0: Kd> lm v m tcpip Browse full module list start end module name fffff801`09eeb000 fffff801`0a157000 tcpip (no symbols) Loaded symbol image file: tcpip.sys Image path: \SystemRoot\System32\drivers\tcpip.sys Image name: tcpip.sys Browse all global symbols functions data Timestamp: Sun Nov 09 18:59:03 2014 (546029F7) CheckSum: 00263DB1 ImageSize: 0026C000 Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4 Unable to enumerate user-mode unloaded modules, Win32 error 0n30
Det finns ingen angiven symbolsökväg eller inlästa symboler, så endast begränsad information är tillgänglig i felsökningsprogrammet.
Ladda ned och skapa KMDF-ekodrivrutin
I det här avsnittet laddar du ned och skapar KMDF-ekodrivrutinen.
Vanligtvis arbetar du med din egen drivrutinskod när du använder WinDbg. För att bekanta dig med WinDbg-åtgärden använder det här labbet KMDF-mallens "Echo"-exempeldrivrutin. Källkoden är tillgänglig för att förstå informationen som visas i WinDbg. Det här exemplet används också för att illustrera hur du enkelt kan gå igenom inbyggd kernel-lägeskod. Den här tekniken kan vara värdefull för felsökning av komplexa kodproblem i kernelläge.
Visa ekoexemplet i GitHub.
Läs om exemplet.
Bläddra alla Windows-drivrutinsexempel.
Så här laddar du ned och skapar Echo-exempeldrivrutinen:
Ladda först ned och extrahera KMDF Echo-exempel från GitHub.
KMDF Echo-exemplet finns i mappen allmänna.
Ladda ned drivrutinsexemplen i en zip-fil: Drivrutinsexempel
Ladda ned zip-filen till den lokala hårddisken.
Välj och håll ned eller högerklicka på zip-filen och välj Extrahera alla. Ange en ny mapp eller bläddra till en befintlig mapp för att lagra de extraherade filerna. Du kan till exempel ange C:\DriverSamples\ som den nya mapp som filerna ska extraheras i.
När filerna har extraherats går du till följande undermapp: C:\DriverSamples\general\echo\kmdf
I Microsoft Visual Studio väljer du File>Open>Project/Solution... och går till mappen som innehåller de extraherade filerna, till exempel C:\DriverSamples\general\echo\kmdf. Dubbelklicka på kmdfecho lösningsfil för att öppna den.
Leta upp Solution Explorer i Visual Studio. Om det här fönstret inte redan är öppet väljer du Solution Explorer på menyn Visa. I Solution Explorer kan du se en lösning som har tre projekt.
Ange exemplets konfiguration och plattform. I Solution Explorer väljer du och håller eller högerklickar på lösning "kmdfecho" (3 projekt)och väljer Configuration Manager. Kontrollera att konfigurations- och plattformsinställningarna är desamma för de tre projekten. Som standard är konfigurationen inställd på Win10 Debugoch plattformen är inställd på Win64- för alla projekt. Om du gör några konfigurations- eller plattformsändringar för ett projekt gör du samma ändringar för de återstående tre projekten.
Drivrutinsexempel måste ändras för att använda värden som inte överlappar befintliga drivrutiner. Se Från exempelkod till produktionsdrivrutin – Vad du ska ändra i exemplen om hur du skapar ett unikt drivrutinsexempel som samexisterar med befintliga verkliga drivrutiner installerade i Windows.
Ange körningsbiblioteket. Öppna egenskapssidan för ekodrivrutinen och leta upp C/C++>Kodgenerering. Ändra Runtime-biblioteket till Felsökning med flera trådar (/MTd). Mer information om byggalternativen finns i /MD, /MT, /LD (Använd Run-Time-bibliotek).
I drivrutinsegenskaperna kontrollerar du att Drivrutinssigneringens>Signeringsläge är inställt på Testsignering.
I Visual Studio väljer du Build>Build Solution.
Byggfönstren bör visa ett meddelande som anger att bygget för alla tre projekten lyckades.
Tips
Om du får ett build-felmeddelande använder du versionsfelnumret för att fastställa en korrigering. Till exempel beskriver MSBuild-fel MSB8040 hur du arbetar med spectre-minimerade bibliotek.
I Utforskaren går du till mappen som innehåller de extraherade filerna för exemplet. Gå till exempel till C:\DriverSamples\general\echo\kmdf, om det är den mapp som du angav tidigare. I den mappen varierar platsen för de kompilerade drivrutinsfilerna beroende på de konfigurations- och plattformsinställningar som du valde i Configuration Manager. Om du har lämnat standardinställningarna oförändrade sparas de kompilerade drivrutinsfilerna i en mapp med namnet \x64\Debug för en 64-bitars felsökningsversion.
Gå till mappen som innehåller de skapade filerna för autosynkron drivrutinen: C:\DriverSamples\general\echo\kmdf\driver\AutoSync\x64\Debug.
Mappen ska innehålla följande filer:
Fil Beskrivning Echo.sys Drivrutinsfilen. Echo.inf En inf-fil (information) som innehåller information som behövs för att installera drivrutinen. Dessutom skapades echoapp.exe-filen och den bör finnas här: C:\DriverSamples\general\echo\kmdf\exe\x64\Debug.
Fil Beskrivning EchoApp.exe En exekverbar testfil för kommandoradsgränssnitt som kommunicerar med drivrutinen för echo.sys. Hitta ett USB-minne eller konfigurera en nätverksresurs för att kopiera de byggda drivrutinsfilerna och testprogrammet EchoApp från värden till målsystemet.
I nästa avsnitt kopierar du koden till målsystemet och installerar och testar drivrutinen.
Installera KMDF-ekodrivrutinsexemplet på målsystemet
I det här avsnittet använder du DevCon-verktyget för att installera ekoexempeldrivrutinen.
Den dator där du installerar drivrutinen kallas måldator eller testdator. Vanligtvis är den här datorn separat från den dator där du utvecklar och skapar drivrutinspaketet. Den dator där du utvecklar och skapar drivrutinen kallas värddator.
Processen att flytta drivrutinspaketet till måldatorn och installera drivrutinen kallas distribution av drivrutinen.
Innan du distribuerar en testsignerad drivrutin förbereder du måldatorn genom att aktivera testsignering. Du måste också hitta DevCon-verktyget i WDK-installationen och kopiera det till målsystemet.
Utför följande steg för att installera drivrutinen i målsystemet.
Aktivera testsignerade drivrutiner i målsystemet:
Öppna Windows-inställningar.
I Update and Securityväljer du Recovery.
Under Avancerad startväljer du Starta om nu.
När datorn startas om väljer du startalternativ. I Windows 10 väljer du Felsöka>Avancerade alternativ>Startinställningar och väljer sedan Starta om.
Välj Inaktivera framtvingande av drivrutinssignatur genom att trycka på F7-tangenten.
Starta om måldatorn.
I värdsystemet går du till mappen Tools i WDK-installationen och letar reda på DevCon-verktyget. Titta till exempel i följande mapp: C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe.
Skapa en mapp på målet för det byggda drivrutinspaketet, till exempel C:\EchoDriver. Kopiera devcon.exe till målsystemet. Leta upp .cer certifikatet i värdsystemet. Den finns i samma mapp på värddatorn i mappen som innehåller de skapade drivrutinsfilerna. Kopiera alla filer från den skapade drivrutinen som beskrevs tidigare på värddatorn och spara dem i samma mapp som du skapade på måldatorn.
På måldatorn väljer du och håller ned eller högerklickar på certifikatfilen och väljer Installeraoch följer sedan anvisningarna för att installera testcertifikatet.
Om du behöver mer detaljerade instruktioner för att konfigurera måldatorn kan du läsa Förbereda en dator för manuell drivrutinsdistribution.
Följande instruktioner visar hur du installerar och testar exempeldrivrutinen. Här är den allmänna syntaxen för devcon-verktyget som du använder för att installera drivrutinen:
devcon install <INF file> <hardware ID>
INF-filen som krävs för att installera drivrutinen är echo.inf. Inf-filen innehåller maskinvaru-ID:t för att installera echo.sys. För ekoexemplet är maskinvaru-ID:t root\ECHO.
Öppna ett kommandotolksfönster som administratör på måldatorn. Gå till mappen för drivrutinspaketet och ange följande kommando:
devcon install echo.inf root\ECHO
Om du får ett felmeddelande om att devcon inte kan identifieras, försök då att lägga till sökvägen till verktyget devcon. Om du till exempel kopierade den till en mapp med namnet C:\Toolskan du prova att använda följande kommando:
c:\tools\devcon install echo.inf root\ECHO
En dialogruta visas som anger att testdrivrutinen är en osignerad drivrutin. Välj Installera ändå den här drivrutinen för att fortsätta.
Tips
Om du har problem med installationen kontrollerar du följande fil för mer information. %windir%\inf\setupapi.dev.log
När du har installerat exempeldrivrutinen är du redo att testa den.
På måldatorn går du till kommandotolken och anger devmgmt för att öppna Enhetshanteraren. I Enhetshanteraren går du till menyn Visa och väljer Enheter efter typ. I enhetsträdet letar du upp Exempel på WDF-ekodrivrutin i noden Exempelenhet.
Ange echoapp för att starta testekoappen för att bekräfta att drivrutinen fungerar.
C:\Samples\KMDF_Echo_Sample> echoapp
DevicePath: \\?\root#sample#0005#{cdc35b6e-0be4-4936-bf5f-5537380a7c1a}
Opened device successfully
512 Pattern Bytes Written successfully
512 Pattern Bytes Read successfully
Pattern Verified successfully
30720 Pattern Bytes Written successfully
30720 Pattern Bytes Read successfully
Pattern Verified successfully
Använd WinDbg för att visa information om drivrutinen
I det här avsnittet anger du symbolsökvägen och använder kernel-felsökningskommandon för att visa information om KMDF-ekoexempledrivrutinen.
För att visa information om en drivrutin:
Om du stängde felsökningsprogrammet i värdsystemet öppnar du det igen med hjälp av följande kommando i kommandotolken för administratören.
WinDbg -k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
Använd Ctrl+Break (Rullningslås) för att bryta sig in i koden som körs i målsystemet.
Om du vill ange symbolsökvägen till Microsoft-symbolservern i WinDbg-miljön använder du kommandot
.symfix
.0: kd> .symfix
Lägg till din lokala symbolplats för att använda dina lokala symboler genom att lägga till sökvägen med
.sympath+
och sedan.reload /f
.0: kd> .sympath+ C:\DriverSamples\general\echo\kmdf 0: kd> .reload /f
Kommandot
.reload
med alternativet/f
force tar bort all symbolinformation för den angivna modulen och läser in symbolerna igen. I vissa fall laddar det här kommandot också om eller avlägsnar själva modulen.
Du måste läsa in rätt symboler för att använda avancerade funktioner som WinDbg tillhandahåller. Om du inte har symboler korrekt konfigurerade får du meddelanden som anger att symboler inte är tillgängliga när du försöker använda funktioner som är beroende av symboler.
0:000> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type “.hh dbgerr005” for details.
Det finns många metoder som kan användas för att arbeta med symboler. I många situationer kan du konfigurera datorn för att komma åt symboler från en symbolserver som Microsoft tillhandahåller när de behövs. Det här labbet använder den metoden. Om symbolerna i din miljö finns på en annan plats ändrar du stegen för att använda den platsen. För mer information, se symbolstigen för Windows-debugger.
Om du vill utföra källfelsökning måste du skapa en kontrollerad (debug) version av binärfilerna. Kompilatorn skapar symbolfiler (.pdb-filer). Dessa symbolfiler visar felsökaren hur de binära instruktionerna motsvarar källraderna. Själva källfilerna måste också vara tillgängliga för felsökningsprogrammet.
Symbolfilerna innehåller inte texten i källkoden. För felsökning är det bäst om länkaren inte optimerar din kod. Källfelsökning och åtkomst till lokala variabler är svårare, och ibland nästan omöjligt, om koden har optimerats. Om du har problem med att visa lokala variabler eller källrader anger du följande byggalternativ:
set COMPILE_DEBUG=1
set ENABLE_OPTIMIZER=0
Ange följande kommando i kommandoområdet i felsökningsprogrammet för att visa information om ekodrivrutinen:
0: kd> lm m echo* v Browse full module list start end module name fffff801`4ae80000 fffff801`4ae89000 ECHO (private pdb symbols) C:\Samples\KMDF_ECHO_SAMPLE\echo.pdb Loaded symbol image file: ECHO.sys Image path: \SystemRoot\system32\DRIVERS\ECHO.sys Image name: ECHO.sys ...
Mer information finns i lm.
Eftersom den här labbuppsättningen
prefer_dml
tidigare är vissa element i utdata heta länkar som du kan välja. Välj Bläddra bland alla globala symboler länk i felsökningsutdata för att visa information om objektsymboler som börjar med bokstaven "a".0: kd> x /D Echo!a*
Ekoexemplet innehåller inga symboler som börjar med bokstaven "a". Skriv
x ECHO!Echo*
för att visa information om alla symboler som är associerade med Echo-drivrutinen som börjar med "Echo".0: kd> x ECHO!Echo* fffff801`0bf95690 ECHO!EchoEvtIoQueueContextDestroy (void *) fffff801`0bf95000 ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *) fffff801`0bf95ac0 ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *) fffff801`0bf9b120 ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *) ...
Mer information finns i x (Granska symboler).
Tillägget
!lmi
visar detaljerad information om en modul. Ange!lmi echo
. Dina utdata bör likna den text som visas i det här exemplet:0: kd> !lmi echo Loaded Module Info: [echo] Module: ECHO Base Address: fffff8010bf94000 Image Name: ECHO.sys …
Använd
!dh
-tillägget för att visa rubrikinformation som visas i det här exemplet:0: kd> !dh echo File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (i386) 6 number of sections 54AD8A42 time date stamp Wed Jan 07 11:34:26 2015 ...
Ange följande om du vill ändra standardmasken för felsökningsbit så att alla felsökningsmeddelanden från målsystemet visas i felsökningsprogrammet:
0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
Vissa drivrutiner visar ytterligare information när masken för 0xFFFFFFFF används. Ställ in masken på 0x00000000 om du vill minska mängden information som visas.
0: kd> ed nt!Kd_DEFAULT_MASK 0x00000000
Använd kommandot
dd
för att bekräfta att masken är inställd på att visa alla felsökningsmeddelanden.0: kd> dd nt!kd_DEFAULT_MASK fffff802`bb4057c0 ffffffff 00000000 00000000 00000000 fffff802`bb4057d0 00000000 00000000 00000000 00000000 fffff802`bb4057e0 00000001 00000000 00000000 00000000 fffff802`bb4057f0 00000000 00000000 00000000 00000000 fffff802`bb405800 00000000 00000000 00000000 00000000 fffff802`bb405810 00000000 00000000 00000000 00000000 fffff802`bb405820 00000000 00000000 00000000 00000000 fffff802`bb405830 00000000 00000000 00000000 00000000
Visa information om Plug and Play-enhetsträdet
I det här avsnittet visar du information om ekoexemplets enhetsdrivrutin och var den finns i plug and play-enhetsträdet.
Information om enhetsdrivrutinen i plug and play-enhetsträdet kan vara användbar för felsökning. Om en enhetsdrivrutin till exempel inte finns i enhetsträdet kan det uppstå ett problem med installationen av drivrutinen.
Mer information om tillägget för felsökning av enhetsnoder finns i !devnode.
Om du vill se alla enhetsnoder i plug and play-enhetsträdet i värdsystemet anger du kommandot
!devnode 0 1
.0: kd> !devnode 0 1 Dumping IopRootDeviceNode (= 0xffffe0005a3a8d30) DevNode 0xffffe0005a3a8d30 for PDO 0xffffe0005a3a9e50 InstancePath is "HTREE\ROOT\0" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe0005a3a3d30 for PDO 0xffffe0005a3a4e50 InstancePath is "ROOT\volmgr\0000" ServiceName is "volmgr" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe0005a324560 for PDO 0xffffe0005bd95ca0… …
Använd Ctrl+F för att söka i utdata som genereras för att leta efter namnet på enhetsdrivrutinen, echo.
Ekoenhetsdrivrutinen ska läsas in. Använd kommandot
!devnode 0 1 echo
för att visa Plug and Play-information som är associerad med ekoenhetsdrivrutinen enligt följande exempel:0: Kd> !devnode 0 1 echo Dumping IopRootDeviceNode (= 0xffffe0007b725d30) DevNode 0xffffe0007b71a630 for PDO 0xffffe0007b71a960 InstancePath is "ROOT\SAMPLE\0000" ServiceName is "ECHO" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) …
Utdata från det föregående kommandot inkluderar den PDO som är associerad med den aktuella körningsinstansen av din drivrutin, i det här exemplet 0xffffe0007b71a960. Ange kommandot
!devobj <PDO address>
för att visa Plug and Play-information som är associerad med ekoenhetsdrivrutinen. Använd den PDO-adress som!devnode
visar på din dator, inte den som visas här.0: kd> !devobj 0xffffe0007b71a960 Device object (ffffe0007b71a960) is for: 0000000e \Driver\PnpManager DriverObject ffffe0007b727e60 Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001040 Dacl ffffc102c9b36031 DevExt 00000000 DevObjExt ffffe0007b71aab0 DevNode ffffe0007b71a630 ExtensionFlags (0x00000800) DOE_DEFAULT_SD_PRESENT Characteristics (0x00000180) FILE_AUTOGENERATED_DEVICE_NAME, FILE_DEVICE_SECURE_OPEN AttachedDevice (Upper) ffffe000801fee20 \Driver\ECHO Device queue is not busy.
Utdata som visas i kommandot
!devnode 0 1
innehåller den PDO-adress som är associerad med den instans av drivrutinen som körs. I det här exemplet är den 0xffffe0007b71a960. Ange kommandot!devstack <PDO address>
för att visa Plug and Play-information som är associerad med enhetsdrivrutinen. Använd den PDO-adress som!devnode
visas på datorn, inte den som visas i det här exemplet.0: kd> !devstack 0xffffe0007b71a960 !DevObj !DrvObj !DevExt ObjectName ffffe000801fee20 \Driver\ECHO ffffe0007f72eff0 > ffffe0007b71a960 \Driver\PnpManager 00000000 0000000e !DevNode ffffe0007b71a630 : DeviceInst is "ROOT\SAMPLE\0000" ServiceName is "ECHO"
Utdata visar att du har en ganska enkel enhetsdrivrutinsstack. Ekodrivrutinen är ett barn till PnPManager-noden. PnPManager är en rotnod.
\Driver\ECHO
\Driver\PnpManager
Det här diagrammet visar ett mer komplext enhetsnodträd.
Mer information om mer komplexa drivrutinsstackar finns i Drivrutinsstackar och Enhetsnoder och enhetsstackar.
Arbeta med brytpunkter och källkod
I det här avsnittet ställer du in brytpunkter och enkeltstegar genom källkoden i kärnläge.
För att kunna gå igenom kod och kontrollera värdena för variabler i realtid aktiverar du brytpunkter och anger en sökväg till källkoden.
Brytpunkter stoppar kodkörning vid en viss kodrad. Steg framåt i koden från den punkten för att felsöka det specifika kodavsnittet.
Om du vill ange en brytpunkt med hjälp av ett felsökningskommando använder du något av följande b
kommandon.
Befallning | Beskrivning |
---|---|
bp |
Anger en brytpunkt som är aktiv tills modulen som den finns i avladdas. |
bu |
Anger en brytpunkt som inte är löst när modulen tas bort och återaktiveras när modulen laddas in igen. |
bm |
Anger en brytpunkt för en symbol. Det här kommandot använder bu eller bp på rätt sätt och tillåter att jokertecken (* ) används för att ange brytpunkter för varje symbol som matchar, som alla metoder i en klass. |
Mer information finns i Felsökning av källkod i WinDbg.
I värdsystemet använder du WinDbg-användargränssnittet för att bekräfta att Felsökning>källläge är aktiverat i den aktuella WinDbg-sessionen.
Ange följande kommando för att lägga till din lokala kodplats i källsökvägen:
.srcpath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
Ange följande kommando för att lägga till din lokala symbolplats i symbolsökvägen:
.sympath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
Använd kommandot
x
för att undersöka de symboler som är associerade med ekodrivrutinen för att fastställa funktionsnamnet som ska användas för brytpunkten. Du kan använda ett jokertecken eller Ctrl+F för att lokalisera funktionsnamnetDeviceAdd
.0: kd> x ECHO!EchoEvt* 8b4c7490 ECHO!EchoEvtIoQueueContextDestroy (void *) 8b4c7000 ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *) 8b4c7820 ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *) 8b4cb0e0 ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *) 8b4c75d0 ECHO!EchoEvtIoWrite (struct WDFQUEUE__ *, struct WDFREQUEST__ *, unsigned int) 8b4cb170 ECHO!EchoEvtDeviceAdd (struct WDFDRIVER__ *, struct …
Utdata visar att
DeviceAdd
metoden för din ekodrivrutin ärECHO!EchoEvtDeviceAdd
.Du kan också granska källkoden för att hitta funktionsnamnet för brytpunkten.
Ange brytpunkten med kommandot
bm
med hjälp av namnet på drivrutinen, följt av funktionsnamnet, till exempelAddDevice
, där du vill ange brytpunkten, avgränsad med ett utropstecken. Det här labbet använderAddDevice
för att övervaka att drivrutinen läses in.0: kd> bm ECHO!EchoEvtDeviceAdd 1: fffff801`0bf9b1c0 @!"ECHO!EchoEvtDeviceAdd"
Du kan använda olika syntax tillsammans med att ange variabler som
<module>!<symbol>
,<class>::<method>
,'<file.cpp>:<line number>'
eller hoppa över ett antal gånger<condition> <#>
. Mer information finns i Villkorliga brytpunkter i WinDbg och andra Windows-felsökare.Visa en lista över de aktuella brytpunkterna för att bekräfta att brytpunkten har angetts genom att ange kommandot
bl
:0: kd> bl 1 e fffff801`0bf9b1c0 0001 (0001) ECHO!EchoEvtDeviceAdd
"e" i utdata som visas här anger att brytpunkten nummer 1 är aktiverad så att den kan utlösas.
Återstarta kodkörningen i målsystemet genom att ange
g
(go)-kommandot.Öppna Device Manager i målsystemet Windows med hjälp av ikonen eller ange mmc devmgmt.msc. Expandera noden Exempel i Enhetshanteraren.
Välj och håll ned eller högerklicka på KMDF-ekodrivrutinsposten och välj Inaktivera från menyn.
Välj och håll ned eller högerklicka på KMDF-ekodrivrutinsposten igen och välj Aktivera i menyn.
När drivrutinen i värdsystemet är aktiverad ska AddDevice felsökningsbrytpunkt utlösas. Exekveringen av drivrutinskoden i målsystemet bör avbrytas. När brytpunkten nås ska körningen stoppas vid början av AddDevice--rutinen. Felsökningskommandoutdata visar
Breakpoint 1 hit
.Gå igenom koden rad för rad genom att ange kommandot
p
eller trycka på F10, fram till du når slutet på AddDevice--rutinen. Klammerparentestecknet (}
) är markerat som det visas.
I nästa avsnitt undersöker du tillståndet för variablerna när DeviceAdd-koden har körts.
Du kan ändra befintliga brytpunkter med hjälp av följande kommandon:
Befallning | Beskrivning |
---|---|
bl |
Listar brytpunkter. |
bc |
Rensar en brytpunkt från listan. Använd bc * för att rensa alla brytpunkter. |
bd |
Inaktiverar en brytpunkt. Använd bd * för att inaktivera alla brytpunkter. |
be |
Aktiverar en brytpunkt. Använd be * för att aktivera alla brytpunkter. |
Du kan också ändra brytpunkter i WinDbg-användargränssnittet.
Du kan också ange brytpunkter som utlöses när en minnesplats används. Använd kommandot ba
(break on access) med följande syntax:
ba <access> <size> <address> {options}
Alternativ | Beskrivning |
---|---|
e |
execute: när CPU hämtar en instruktion från adressen |
r |
read/write: när CPU läser eller skriver till adressen |
w |
write: när PROCESSORn skriver till adressen |
Du kan bara ange fyra data brytpunkter vid en viss tidpunkt. Det är upp till dig att se till att du justerar dina data korrekt för att utlösa brytpunkten. Ord måste sluta i adresser som är delbara med 2, dwords måste vara delbara med 4 och quad-ord med 0 eller 8.
Om du till exempel vill ange en brytpunkt för läsning/skrivning på en specifik minnesadress kan du använda ett kommando som det här exemplet.
ba r 4 0x0003f7bf0
Du kan använda följande kommandon för att gå igenom koden med tillhörande kortkommandon som visas inom parenteser.
- Avbryt (Ctrl+Break). Det här kommandot avbryter ett system så länge systemet körs och kommunicerar med WinDbg. Sekvensen i kernelfelsökaren är Ctrl+C.
- Kör till markören (F7 eller Ctrl+F10). Placera markören i ett käll- eller demonteringsfönster där du vill att körningen ska avbrytas och tryck sedan på F7. Kodexekveringen fortsätter till den punkten. Om flödet för kodkörning inte når den punkt som anges av markören, skulle WinDbg inte avbryta exekveringen. Den här situationen kan inträffa om en IF-instruktion inte körs.
- Kör (F5). Kör tills en brytpunkt påträffas eller en händelse som en buggkontroll inträffar.
- Steg över (F10). Det här kommandot gör att kodkörningen går vidare ett uttalande eller en instruktion i taget. När ett anrop påträffas, fortsätter kodkörningen förbi anropet utan att gå in i den anropade rutinen. Om programmeringsspråket är C eller C++ och WinDbg är i källläge kan källläget aktiveras eller inaktiveras med hjälp av Felsöka>källläge.
- Gå in (F11). Det här kommandot liknar "steg över", förutom att körningen av ett anrop faktiskt går in i den anropade rutinen.
- Gå ut (Skift+F11). Det här kommandot gör att körningen körs till och avslutas från den aktuella rutinen eller den aktuella platsen i anropsstacken. Det här kommandot är användbart om du har sett tillräckligt med rutin.
Mer information finns i Felsökning av källkod i WinDbg.
Visa variabler och anropsstackar
I det här avsnittet visar du information om variabler och anropsstackar.
Det här labbet förutsätter att du stoppas vid AddDevice rutin med hjälp av processen som beskrevs tidigare. Om du vill visa utdata som visas här upprepar du stegen som beskrevs tidigare, om det behövs.
Om du vill visa variabler i värdsystemet använder du visa>lokala menyalternativ för att visa lokala variabler.
Om du vill hitta platsen för en global variabeladress anger du ? <variable name>
.
- Steg ut (Shift+F11) – Det här kommandot gör att exekveringen fortsätter och avslutas från aktuell rutin (nuvarande plats i anropsstacken). Detta är användbart om du har sett tillräckligt med rutin.
Mer information finns i Källkodsfelsökning i WinDbg (klassisk) i felsökningsreferensdokumentationen.
Avsnitt 8: Visa variabler och anropsstackar
I avsnitt 8 visar du information om variabler och anropsstackar.
Detta laboratorium förutsätter att du stoppas vid AddDevice-rutinen med hjälp av processen som beskrevs tidigare. Om du vill visa utdata som visas här upprepar du stegen som beskrevs tidigare, om det behövs.
<– På värdsystemet
Visa variabler
Använd -vyn>lokalt menyalternativ för att visa lokala variabler.
Globala variabler
Du hittar platsen för en global variabeladress genom att skriva ? <variabelnamn>.
Lokala variabler
Du kan visa namn och värden för alla lokala variabler för en viss ram genom att skriva kommandot dv.
Om du vill visa namn och värden för alla lokala variabler för en viss ram anger du kommandot dv
:
0: kd> dv
Driver = 0x00001fff`7ff9c838
DeviceInit = 0xffffd001`51978190
status = 0n0
Anropsstacken är kedjan med funktionsanrop som har lett till den aktuella platsen för programräknaren. Den översta funktionen i anropsstacken är den aktuella funktionen och nästa funktion är den funktion som anropade den aktuella funktionen och så vidare.
Om du vill visa anropsstacken använder du kommandona k*
.
Befallning | Beskrivning |
---|---|
kb |
Visar stacken och de tre första parametrarna. |
kp |
Visar staplarna och den fullständiga listan med parametrar. |
kn |
Gör att du kan se stacken med raminformationen bredvid den. |
Om du på värdsystemet vill hålla anropsstacken synlig väljer du visa>anropsstack för att visa den. Välj kolumnerna överst i fönstret för att växla visning av ytterligare information.
Använd kommandot
kn
för att visa anropsstacken när du felsöker exempeladapterkoden vid ett avbrott.3: kd> kn # Child-SP RetAddr Call Site 00 ffffd001`51978110 fffff801`0942f55b ECHO!EchoEvtDeviceAdd+0x66 [c:\Samples\kmdf echo sample\c++\driver\autosync\driver.c @ 138] 01 (Inline Function) --------`-------- Wdf01000!FxDriverDeviceAdd::Invoke+0x30 [d:\wbrtm\minkernel\wdf\framework\shared\inc\private\common\fxdrivercallbacks.hpp @ 61] 02 ffffd001`51978150 fffff801`eed8097d Wdf01000!FxDriver::AddDevice+0xab [d:\wbrtm\minkernel\wdf\framework\shared\core\km\fxdriverkm.cpp @ 72] 03 ffffd001`51978570 fffff801`ef129423 nt!PpvUtilCallAddDevice+0x35 [d:\9142\minkernel\ntos\io\pnpmgr\verifier.c @ 104] 04 ffffd001`519785b0 fffff801`ef0c4112 nt!PnpCallAddDevice+0x63 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 7397] 05 ffffd001`51978630 fffff801`ef0c344f nt!PipCallDriverAddDevice+0x6e2 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 3390] ...
Anropsstacken visar att kärnan (nt) anropade Plug and Play-kod (PnP) som kallade drivrutinsramverkskod (WDF), som senare anropade drivrutinens eko DeviceAdd
-funktion.
Visa processer och trådar
I det här avsnittet visar du information om processer och trådar som körs i kernelläge.
Processer
Du kan visa eller ange processinformation med hjälp av felskökningstillägget !process. Ange en brytpunkt för att undersöka processen som används när ett ljud spelas upp.
I värdsystemet anger du kommandot
dv
för att undersöka lokalvariablerna som är associerade medEchoEvtIo
-rutinen.0: kd> dv ECHO!EchoEvtIo* ECHO!EchoEvtIoQueueContextDestroy ECHO!EchoEvtIoWrite ECHO!EchoEvtIoRead
Rensa föregående brytpunkter med hjälp av
bc *
:0: kd> bc *
Ange en symbolbrytningspunkt för
EchoEvtIo
rutiner med hjälp av följande kommando:0: kd> bm ECHO!EchoEvtIo* 2: aade5490 @!”ECHO!EchoEvtIoQueueContextDestroy” 3: aade55d0 @!”ECHO!EchoEvtIoWrite” 4: aade54c0 @!”ECHO!EchoEvtIoRead”
Visa en lista över brytpunkter för att bekräfta att brytpunkten har angetts korrekt:
0: kd> bl 1 e aabf0490 [c:\Samples\kmdf echo sample\c++\driver\autosync\queue.c @ 197] 0001 (0001) ECHO!EchoEvtIoQueueContextDestroy ...
Ange
g
för att starta om kodkörningen:0: kd> g
Kör
EchoApp.exe
drivrutinstestprogrammet på målsystemet.När testappen körs i värdsystemet anropas I/O-rutinen i drivrutinen. Det här anropet orsakar att brytpunkten aktiveras och körningen av drivrutinskoden på målsystemet stoppas.
Breakpoint 2 hit ECHO!EchoEvtIoWrite: fffff801`0bf95810 4c89442418 mov qword ptr [rsp+18h],r8
Använd kommandot
!process
för att visa den aktuella processen som ingår i körningen echoapp.exe:0: kd> !process PROCESS ffffe0007e6a7780 SessionId: 1 Cid: 03c4 Peb: 7ff7cfec4000 ParentCid: 0f34 DirBase: 1efd1b000 ObjectTable: ffffc001d77978c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000802c79f0 Vads 30 Clone 0 Private 135. Modified 5. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf270050 ElapsedTime 00:00:00.052 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (682, 50, 345) (2728KB, 200KB, 1380KB) PeakWorkingSetSize 652 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 688 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe00080e32080 Cid 03c4.0ec0 Teb: 00007ff7cfece000 Win32Thread: 0000000000000000 RUNNING on processor 1
Utdata visar att processen är associerad med den echoapp.exe tråden, som kördes när din brytpunkt på drivrutinsskrivningshändelsen träffades. Mer information finns i !process.
Använd
!process 0 0
för att visa sammanfattningsinformation för alla processer. I utdata använder du Ctrl+F för att hitta samma processadress för processen som är associerad med echoapp.exe bilden. I exemplet är processadressenffffe0007e6a7780
.... PROCESS ffffe0007e6a7780 SessionId: 1 Cid: 0f68 Peb: 7ff7cfe7a000 ParentCid: 0f34 DirBase: 1f7fb9000 ObjectTable: ffffc001cec82780 HandleCount: 34. Image: echoapp.exe ...
Registrera process-ID:t som är associerat med echoapp.exe som ska användas senare i den här labbuppgiften. Du kan också använda Ctrl+C för att kopiera adressen till kopieringsbufferten för senare användning.
_____________________________________________________(echoapp.exe processadress)
Ange
g
vid behov i felsökningsprogrammet för att köra koden vidare tills echoapp.exe har körts klart. Den träffar brytpunkten i läs- och skrivhändelsen många gånger. När echoapp.exe är klar bryter du in i felsökningsprogrammet genom att trycka på Ctrl+ScrLk (Ctrl+Break).Använd kommandot
!process
för att bekräfta att du kör en annan process. I utdata som visas här skiljer sig processen med avbildningsvärdet för System från värdet Echo Image.1: kd> !process PROCESS ffffe0007b65d900 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 001ab000 ObjectTable: ffffc001c9a03000 HandleCount: 786. Image: System VadRoot ffffe0007ce45930 Vads 14 Clone 0 Private 22. Modified 131605. Locked 64. DeviceMap ffffc001c9a0c220 Token ffffc001c9a05530 ElapsedTime 21:31:02.516 ...
Utdata visar att en systemprocess ffffe0007b65d900 kördes när du stoppade operativsystemet.
Använd kommandot
!process
för att försöka titta på process-ID:t som hade associerats med echoapp.exe som du spelade in tidigare. Ange din echoapp.exe processadress som du registrerade tidigare, i stället för den exempelprocessadress som visas i det här exemplet.0: kd> !process ffffe0007e6a7780 TYPE mismatch for process object at 82a9acc0
Processobjektet är inte längre tillgängligt eftersom echoapp.exe processen inte längre körs.
Trådar
Kommandona för att visa och ange trådar liknar kommandona för processer. Använd kommandot !thread för att visa trådar. Använd .thread för att ange aktuella trådar.
I värdsystemet anger du
g
i felsökningsprogrammet för att starta om kodkörningen i målsystemet.Kör EchoApp.exe drivrutinstestprogrammet på målsystemet.
I värdsystemet nås brytpunkten och kodkörningen stoppas.
Breakpoint 4 hit ECHO!EchoEvtIoRead: aade54c0 55 push ebp
Om du vill visa de trådar som körs anger du !thread. Information som liknar följande exempel bör visas:
0: kd> !thread THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0008096c900 Image: echoapp.exe ...
Observera avbildningsnamnet för echoapp.exe. Det indikerar att du tittar på tråden som är associerad med testappen.
Använd kommandot
!process
för att avgöra om den här tråden är den enda tråden som körs i processen som är associerad med echoapp.exe. Trådnumret för den tråd som körs i processen är samma tråd som körs som kommandot!thread
visade.0: kd> !process PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf5dc050 ElapsedTime 00:00:00.048 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (681, 50, 345) (2724KB, 200KB, 1380KB) PeakWorkingSetSize 651 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 686 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0
Använd kommandot
!process 0 0
för att hitta processadressen för två relaterade processer och registrera processadressen här.Cmd.exe: ____________________________________________________________
EchoApp.exe: _______________________________________________________
0: kd> !process 0 0 … PROCESS ffffe0007bbde900 SessionId: 1 Cid: 0f34 Peb: 7ff72dfa7000 ParentCid: 0c64 DirBase: 19c5fa000 ObjectTable: ffffc001d8c2f300 HandleCount: 31. Image: cmd.exe … PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe …
Du kan också använda
!process 0 17
för att visa detaljerad information om varje process. Utdata från det här kommandot kan vara långa. Du kan söka i utdata med Ctrl+F.Använd kommandot
!process
för att lista processinformation för båda processerna som kör datorn. Ange processadressen från dina!process 0 0
utdata, inte adressen som visas i det här exemplet.Det här exemplet är för det cmd.exe process-ID som registrerades tidigare. Avbildningsnamnet för det här process-ID:t är cmd.exe.
0: kd> !process ffffe0007bbde900 PROCESS ffffe0007bbde900 SessionId: 1 Cid: 0f34 Peb: 7ff72dfa7000 ParentCid: 0c64 DirBase: 19c5fa000 ObjectTable: ffffc001d8c2f300 HandleCount: 31. Image: cmd.exe VadRoot ffffe0007bb8e7b0 Vads 25 Clone 0 Private 117. Modified 20. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001d8c48050 ElapsedTime 21:33:05.840 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 24656 QuotaPoolUsage[NonPagedPool] 3184 Working Set Sizes (now,min,max) (261, 50, 345) (1044KB, 200KB, 1380KB) PeakWorkingSetSize 616 VirtualSize 2097164 Mb PeakVirtualSize 2097165 Mb PageFaultCount 823 MemoryPriority FOREGROUND BasePriority 8 CommitCharge 381 THREAD ffffe0007cf34880 Cid 0f34.0f1c Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable ffffe0008096c900 ProcessObject Not impersonating ...
Det här exemplet är för det echoapp.exe process-ID som registrerades tidigare.
0: kd> !process ffffe0008096c900 PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf5dc050 ElapsedTime 00:00:00.048 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (681, 50, 345) (2724KB, 200KB, 1380KB) PeakWorkingSetSize 651 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 686 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating ...
Registrera den första trådadressen som är associerad med de två processerna här.
Cmd.exe: ____________________________________________________
EchoApp.exe: _________________________________________________
Använd kommandot
!Thread
för att visa information om den aktuella tråden.0: kd> !Thread THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0008096c900 Image: echoapp.exe Attached Process N/A Image: N/A ...
Som förväntat är den aktuella tråden den tråd som är associerad med echoapp.exe och det är i körläge.
Använd kommandot
!Thread
för att visa information om tråden som är associerad med cmd.exe process. Ange den trådadress som du registrerade tidigare.0: kd> !Thread ffffe0007cf34880 THREAD ffffe0007cf34880 Cid 0f34.0f1c Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable ffffe0008096c900 ProcessObject Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0007bbde900 Image: cmd.exe Attached Process N/A Image: N/A Wait Start TickCount 4134621 Ticks: 0 Context Switch Count 4056 IdealProcessor: 0 UserTime 00:00:00.000 KernelTime 00:00:01.421 Win32 Start Address 0x00007ff72e9d6e20 Stack Init ffffd0015551dc90 Current ffffd0015551d760 Base ffffd0015551e000 Limit ffffd00155518000 Call 0 Priority 14 BasePriority 8 UnusualBoost 3 ForegroundBoost 2 IoPriority 2 PagePriority 5 Child-SP RetAddr : Args to Child : Call Site ffffd001`5551d7a0 fffff801`eed184fe : fffff801`eef81180 ffffe000`7cf34880 00000000`fffffffe 00000000`fffffffe : nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109] ffffd001`5551d8e0 fffff801`eed17f79 : ffff03a5`ca56a3c8 000000de`b6a6e990 000000de`b6a6e990 00007ff7`d00df000 : nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347] ffffd001`5551d980 fffff801`eecea340 : ffffd001`5551da18 00000000`00000000 00000000`00000000 00000000`00000388 : nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619] ...
Den här tråden är associerad med cmd.exe och är i vänteläge.
Ange trådadressen för den väntande CMD.exe tråden för att ändra kontexten till den väntande tråden.
0: kd> .Thread ffffe0007cf34880 Implicit thread is now ffffe000`7cf34880
Använd kommandot
k
för att visa anropsstacken som är associerad med den väntande tråden.0: kd> k *** Stack trace for last set context - .thread/.cxr resets it # Child-SP RetAddr Call Site 00 ffffd001`5551d7a0 fffff801`eed184fe nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109] 01 ffffd001`5551d8e0 fffff801`eed17f79 nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347] 02 ffffd001`5551d980 fffff801`eecea340 nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619] 03 ffffd001`5551da00 fffff801`ef02e642 nt!KeWaitForSingleObject+0x2c0 [d:\9142\minkernel\ntos\ke\wait.c @ 683] ...
Anropsstackens element, till exempel
KiCommitThreadWait
anger att den här tråden inte körs som förväntat.
Mer information om trådar och processer finns i följande referenser:
IRQL, registrerar och avslutar WinDbg-sessionen
I det här avsnittet visar du nivån för avbrottsbegäran (IRQL) och innehållet i registren.
Visa den sparade IRQL
IRQL används för att hantera prioriteten för avbrottsservice. Varje processor har en IRQL-inställning som trådar kan höja eller sänka. Avbrott som inträffar vid eller under processorns IRQL-inställning är maskerade och stör inte den aktuella åtgärden. Avbrott som inträffar ovanför processorns IRQL-inställning har företräde framför den aktuella åtgärden.
I värdsystemet visar tillägget !irql IRQL på måldatorns aktuella processor innan felsökningsavbrottet inträffade. När måldatorn går in i felsökningsprogrammet ändras IRQL, men den IRQL som var effektiv precis innan debuggerpausen sparas och visas med !irql
.
0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)
Visa registren
I värdsystemet visar du innehållet i registren för den aktuella tråden på den aktuella processorn med hjälp av kommandot r (Register).
0: kd> r
rax=000000000000c301 rbx=ffffe00173eed880 rcx=0000000000000001
rdx=000000d800000000 rsi=ffffe00173eed8e0 rdi=ffffe00173eed8f0
rip=fffff803bb757020 rsp=ffffd001f01f8988 rbp=ffffe00173f0b620
r8=000000000000003e r9=ffffe00167a4a000 r10=000000000000001e
r11=ffffd001f01f88f8 r12=0000000000000000 r13=ffffd001f01efdc0
r14=0000000000000001 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000202
nt!DbgBreakPointWithStatus:
fffff803`bb757020 cc int 3
Du kan också visa innehållet i registren genom att välja View>Registers. För mer information, se r (Register).
Att visa innehållet i registren kan vara användbart när du går igenom körningen av kod för sammansättningsspråk och i andra scenarier. Mer information om disassemblering av assemblerkod finns i Annotated x86 Disassembly och Annotated x64 disassembly.
Information om innehållet i registret finns i x86-arkitektur och x64-arkitektur.
Avsluta WinDbg-sessionen
Om du vill lämna felsökningsprogrammet kopplat, men vill arbeta med målet, rensa eventuella brytpunkter med bc *
, så att måldatorn inte försöker ansluta till värddatorns felsökningsprogram. Använd sedan kommandot g
för att låta måldatorn köras igen.
Avsluta felsökningssessionen genom att bryta dig in i felsökningsprogrammet i värdsystemet och ange kommandot qd
(Avsluta och Koppla från) eller välj Sluta felsöka på menyn.
0: kd> qd
Mer information finns i Avsluta en felsökningssession i WinDbg.
Windows-felsökningsresurser
Mer information finns i Windows-felsökning. Vissa av dessa böcker använder tidigare versioner av Windows som Windows Vista i sina exempel, men de begrepp som beskrivs gäller för de flesta versioner av Windows.
Böcker
- Avancerad Windows-felsökning av Mario Hewardt och Daniel Pravat
- Windows Debugging inifrån: En praktisk guide till felsöknings- och spårningsstrategier i Windows® av Tarik Soulami
- Windows Internals av Pavel Yosifovich, Alex Ionescu, Mark Russinovich och David Solomon
Video
Utbildningsleverantörer