Dela via


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:

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.

Diagram som illustrerar två datorer som är anslutna via en nätverkshubb eller router.

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:

  1. Ö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 . . . . . . . . . :
    
  2. Registrera värdsystemets IP-adress: ______________________________________

  3. Ö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.

  1. Ö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
    
  2. Ange det här kommandot för att aktivera testsignering:

    bcdedit /set TESTSIGNING ON 
    
  3. 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.

  4. 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.

    Skärmbild av dialogrutan Windows-säkerhetsavisering som anger att Windows-brandväggen har blockerat vissa funktioner i en app.

  5. Ö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.

  6. Ö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
    
  7. Starta om målsystemet.

  8. 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.

  1. 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.

    huvudskärmen i felsökningsprogrammet som visar kommandofönstrets utdata från en live-kernelanslutning.

  2. 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
    
  3. 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.

    Skärmbild av felsökningsprogrammet som visar hjälp för kommandot .prefer-dml.

  4. 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
    
  5. 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.

  6. 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.

Så här laddar du ned och skapar Echo-exempeldrivrutinen:

  1. Ladda först ned och extrahera KMDF Echo-exempel från GitHub.

    KMDF Echo-exemplet finns i mappen allmänna.

    Skärmbild av sidan GitHub windows-driver-samples som markerar mappen 'general' och nedladdningsknappen för zip-fil.

    1. Ladda ned drivrutinsexemplen i en zip-fil: Drivrutinsexempel

    2. Ladda ned zip-filen till den lokala hårddisken.

    3. 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.

    4. När filerna har extraherats går du till följande undermapp: C:\DriverSamples\general\echo\kmdf

  2. 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.

    Skärmbild av Visual Studio som visar filen device.c som lästs in från kmdfecho-projektet.

  3. 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.

  4. 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.

  5. 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).

    Skärmbild av egenskapssidan i Visual Studio som visar den markerade inställningen för körbiblioteket.

  6. I drivrutinsegenskaperna kontrollerar du att Drivrutinssigneringens>Signeringsläge är inställt på Testsignering.

    Skärmbild av ekoegenskapssidan i Visual Studio som markerar inställningen för signalläge.

  7. 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.

  1. 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.
  2. 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:

  1. Öppna Windows-inställningar.

  2. I Update and Securityväljer du Recovery.

  3. Under Avancerad startväljer du Starta om nu.

  4. 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.

  5. Välj Inaktivera framtvingande av drivrutinssignatur genom att trycka på F7-tangenten.

  6. 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.

Skärmbild av Windows-säkerhetsvarning som anger att Windows inte kan verifiera utgivaren av drivrutinsprogramvaran.

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.

Skärmbild av Device Manager-trädet som markerar WDF-exempelekodrivrutinen.

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:

  1. 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
    
  2. Använd Ctrl+Break (Rullningslås) för att bryta sig in i koden som körs i målsystemet.

  3. Om du vill ange symbolsökvägen till Microsoft-symbolservern i WinDbg-miljön använder du kommandot .symfix.

    0: kd> .symfix
    
  4. 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
  1. 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.

  2. 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*
    
  3. 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).

  4. 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
    … 
    
  5. 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
    ...
    
  6. 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.

  1. 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…
    …
    
  2. Använd Ctrl+F för att söka i utdata som genereras för att leta efter namnet på enhetsdrivrutinen, echo.

    Skärmbild av dialogrutan Sök i WinDbg som söker efter termen 'eko'.

  3. 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)
    …
    
  4. 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.
    
  5. 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.

diagram som illustrerar ett enhetsnodträd som består av cirka 20 noder.

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.

  1. 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.

  2. 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
    
  3. 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
    
  4. 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 funktionsnamnet DeviceAdd.

    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 är ECHO!EchoEvtDeviceAdd.

    Du kan också granska källkoden för att hitta funktionsnamnet för brytpunkten.

  5. Ange brytpunkten med kommandot bm med hjälp av namnet på drivrutinen, följt av funktionsnamnet, till exempel AddDevice, där du vill ange brytpunkten, avgränsad med ett utropstecken. Det här labbet använder AddDevice 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.

  6. 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.

  7. Återstarta kodkörningen i målsystemet genom att ange g (go)-kommandot.

  8. Öppna Device Manager i målsystemet Windows med hjälp av ikonen eller ange mmc devmgmt.msc. Expandera noden Exempel i Enhetshanteraren.

  9. Välj och håll ned eller högerklicka på KMDF-ekodrivrutinsposten och välj Inaktivera från menyn.

  10. Välj och håll ned eller högerklicka på KMDF-ekodrivrutinsposten igen och välj Aktivera i menyn.

  11. 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.

    Skärmbild av WinDbg som visar lokala exempelkod och kommandofönster.

  12. 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.

    Skärmbild av kodfönstret med klammerparentestecken markerat i början av AddDevice-rutinen.

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.

Skärmbild av WinDbg som visar fönstret med 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.

Skärmbild av WinDbg som visar fönstret för 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.
  1. 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.

    Skärmbild av WinDbg som visar anropsstackfönstret.

  2. 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.

  1. I värdsystemet anger du kommandot dv för att undersöka lokalvariablerna som är associerade med EchoEvtIo-rutinen.

    0: kd> dv ECHO!EchoEvtIo*
    ECHO!EchoEvtIoQueueContextDestroy
    ECHO!EchoEvtIoWrite
    ECHO!EchoEvtIoRead         
    
  2. Rensa föregående brytpunkter med hjälp av bc *:

    0: kd> bc *  
    
  3. 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”
    
  4. 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
    ...
    
  5. Ange g för att starta om kodkörningen:

    0: kd> g
    
  6. Kör EchoApp.exe drivrutinstestprogrammet på målsystemet.

  7. 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
    
  8. 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.

  9. 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 processadressen ffffe0007e6a7780.

    ...
    
    PROCESS ffffe0007e6a7780
        SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
        DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
        Image: echoapp.exe
    
    ...
    
  10. 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)

  11. 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).

  12. 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.

  13. 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.

  1. I värdsystemet anger du g i felsökningsprogrammet för att starta om kodkörningen i målsystemet.

  2. Kör EchoApp.exe drivrutinstestprogrammet på målsystemet.

  3. I värdsystemet nås brytpunkten och kodkörningen stoppas.

    Breakpoint 4 hit
    ECHO!EchoEvtIoRead:
    aade54c0 55              push    ebp
    
  4. 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.

  5. 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
    
  6. 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.

  7. 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
    ...
    
  8. Registrera den första trådadressen som är associerad med de två processerna här.

    Cmd.exe: ____________________________________________________

    EchoApp.exe: _________________________________________________

  9. 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.

  10. 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.

  11. 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
    
  12. 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.

Se även