Delen via


Debuggen van Windows-stuurprogramma's, stap-voor-stap laboratorium (echo kernel-modus)

In dit lab wordt het Foutopsporingsprogramma van de WinDbg-kernel geïntroduceerd. U gebruikt WinDbg om fouten op te sporen in de voorbeeldstuurprogrammacode voor de kernelmodus van de echo.

Testdoelstellingen

Dit lab bevat oefeningen die de hulpprogramma's voor foutopsporing introduceren, algemene foutopsporingsopdrachten leren, het gebruik van onderbrekingspunten illustreren en laten zien hoe u de foutopsporingsextensies gebruikt.

In dit lab gebruikt u een live kernelfoutopsporingsverbinding om de volgende acties te onderzoeken:

  • De Windows-foutopsporingsprogramma-opdrachten gebruiken
  • Standaardopdrachten gebruiken (aanroepstacks, variabelen, threads, IRQL)
  • Geavanceerde opdrachten voor foutopsporing van stuurprogramma's (!-opdrachten) gebruiken
  • Symbolen gebruiken
  • Onderbrekingspunten instellen in live foutopsporing
  • Oproepstacks weergeven
  • De Plug and Play-apparaatstructuur weergeven
  • Werken met thread- en procescontext

Foutopsporing in de gebruikers- en kernelmodus

Wanneer u met het Windows-foutopsporingsprogramma werkt, kunt u twee typen foutopsporing uitvoeren:

gebruikersmodus - Toepassingen en subsystemen worden uitgevoerd op de computer in de gebruikersmodus. Processen die in de gebruikersmodus worden uitgevoerd, doen dit binnen hun eigen virtuele adresruimten. Ze kunnen geen directe toegang krijgen tot veel onderdelen van het systeem, waaronder systeemhardware, geheugen dat niet is toegewezen voor hun gebruik en andere delen van het systeem die de systeemintegriteit kunnen beschadigen. Omdat processen die worden uitgevoerd in de gebruikersmodus effectief worden geïsoleerd van het systeem en andere processen in de gebruikersmodus, kunnen ze deze resources niet verstoren.

kernelmodus: het besturingssysteem en de bevoegde programma's worden uitgevoerd in de kernelmodus. Code in de kernelmodus heeft machtigingen voor toegang tot een deel van het systeem. Het is niet beperkt zoals code in gebruikersmodus. Het kan toegang krijgen tot elk onderdeel van elk ander proces dat wordt uitgevoerd in de gebruikersmodus of kernelmodus. Veel van de kernfunctionaliteit van het besturingssysteem en veel hardwareapparaatstuurprogramma's worden uitgevoerd in de kernelmodus.

In deze oefening worden foutopsporingsopdrachten behandeld die vaak worden gebruikt tijdens foutopsporing in de gebruikersmodus en kernelmodus. De oefening bevat ook foutopsporingsextensies, ook wel 'bang' !commandsgenoemd, die worden gebruikt voor foutopsporing in kernelmodus.

Lab instellen

U hebt de volgende hardware nodig om het lab te voltooien:

  • Een laptop of desktopcomputer (host) met Windows 10
  • Een tweede laptop of desktopcomputer (doel) met Windows 10
  • Een netwerkhub of router en netwerkkabels om de twee computers te verbinden
  • Toegang tot internet om symboolbestanden te downloaden

U hebt de volgende software nodig om het lab te voltooien:

  • Visual Studio
  • Windows Software Development Kit (SDK) voor Windows 10
  • Windows Driver Kit (WDK) voor Windows 10
  • Het voorbeeld-echostuurprogramma voor Windows 10

Het lab bevat de volgende secties:

Verbinding maken met een WinDbg-sessie in de kernelmodus

In deze sectie configureert u netwerkopsporing op de host en het doelsysteem.

De computers in dit lab moeten worden geconfigureerd voor het gebruik van een Ethernet-netwerkverbinding voor kernelfoutopsporing.

In dit lab worden twee computers gebruikt. Windows-foutopsporingsprogramma wordt uitgevoerd op de host systeem en het KMDF-echostuurprogramma (Kernel Mode Driver Framework) wordt uitgevoerd op het doelsysteem systeem.

Gebruik een netwerkhub of router en netwerkkabels om de twee computers te verbinden.

diagram dat twee computers illustreert die zijn verbonden via een netwerkhub of router.

Als u wilt werken met kernelmodustoepassingen en WinDbg wilt gebruiken, raden we u aan het KDNET over Ethernet-transport te gebruiken. Zie Aan de slag met WinDbg (kernelmodus)voor meer informatie over het gebruik van het Ethernet-transportprotocol. Voor meer informatie over het instellen van de doeldator, zie Een computer voorbereiden voor handmatige implementatie van stuurprogramma's en Het automatisch instellen van KDNET-netwerkkernelfoutopsporing.

Foutopsporing in kernelmodus configureren met behulp van ethernet

Foutopsporing in kernelmodus inschakelen op het doelsysteem:

  1. Open op het hostsysteem een opdrachtpromptvenster en voer ipconfig- in om het IPv4-adres te bepalen.

    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. Noteer het IP-adres van het hostsysteem: ______________________________________

  3. Open op het doelsysteem een opdrachtpromptvenster en gebruik de opdracht ping om de netwerkverbinding tussen de twee systemen te bevestigen.

    ping 169.182.1.1
    

    Gebruik het werkelijke IP-adres van het hostsysteem dat u hebt vastgelegd in plaats van 169.182.1.1 die wordt weergegeven in de voorbeelduitvoer.

    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
    

Schakel foutopsporing in de kernelmodus in op het doelsysteem door de volgende stappen uit te voeren.

Belangrijk

Voordat u BCDEdit gebruikt om opstartgegevens te wijzigen, moet u mogelijk de Windows-beveiligingsfuncties, zoals BitLocker en Beveiligd opstarten, tijdelijk onderbreken op de testcomputer. Schakel deze beveiligingsfuncties opnieuw in wanneer het testen is voltooid. Beheer de testcomputer op de juiste manier wanneer de beveiligingsfuncties zijn uitgeschakeld. Beveiligd opstarten is doorgaans uitgeschakeld in UEFI. Voor toegang tot de UEFI-instelling gebruikt u Systeem, Herstel, Geavanceerd opstarten. Bij opnieuw opstarten selecteert u Problemen oplossen, Geavanceerde opties, UEFI-firmware-instellingen. Wees voorzichtig, omdat uEFI-opties onjuist instelt of BitLocker uitschakelt, kan het systeem onbruikbaar zijn.

  1. Open op de doelcomputer een opdrachtpromptvenster als administrator. Voer deze opdracht in om foutopsporing in te schakelen:

    bcdedit /set {default} DEBUG YES
    
  2. Voer deze opdracht in om testondertekening in te schakelen:

    bcdedit /set TESTSIGNING ON 
    
  3. Voer deze opdracht in om het IP-adres van het hostsysteem in te stellen. Gebruik het IP-adres van het hostsysteem dat u eerder hebt vastgelegd, niet het adres dat u eerder hebt weergegeven.

    bcdedit /dbgsettings net hostip:192.168.1.1 port:50000 key:2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    

    Waarschuwing

    Gebruik een automatisch gegenereerde willekeurige sleutel om de beveiliging van de verbinding te vergroten en het risico van verbindingsaanvragen voor foutopsporing voor willekeurige clients te verminderen. Zie Foutopsporing van KDNET-netwerkkernel automatischinstellen voor meer informatie.

  4. Voer deze opdracht in om te controleren of de waarden voor dbgsettings juist zijn ingesteld:

    bcdedit /dbgsettings
    
    key                     2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    debugtype               NET
    hostip                  169.168.1.1
    port                    50000
    dhcp                    Yes
    The operation completed successfully.
    

    Notitie

    Als u een bericht van de firewall ontvangt en u het foutopsporingsprogramma wilt gebruiken, selecteert u alle drie de vakken.

    Schermafbeelding van het dialoogvenster Windows-beveiligingswaarschuwing dat aangeeft dat sommige functies van een app zijn geblokkeerd door Windows Firewall.

  5. Open op de hostcomputer een opdrachtpromptvenster als administrator. Dit lab maakt gebruik van de x64-versie van WinDbg.exe van de Windows Driver Kit (WDK) die is geïnstalleerd als onderdeel van de installatie van de Windows-kit. Ga naar de standaardmap van WinDbg, de standaardlocatie is hieronder te zien.

    cd C:\Program Files(x86)\Windows Kits\10\Debuggers\x64 
    

    In deze labs wordt ervan uitgegaan dat beide computers een 64-bits versie van Windows uitvoeren op zowel het doel als de host. Als dat niet het geval is, is het het beste om dezelfde bitness van hulpprogramma's op de host te draaien als die het doel draait. Als het doel bijvoorbeeld 32-bits Windows uitvoert, voert u een 32-bits versie van het foutopsporingsprogramma uit op de host. Zie voor meer informatie De 32-bits of 64-bits debuggingtools kiezen.

  6. Open WinDbg met foutopsporing voor externe gebruikers met behulp van de volgende opdracht. De waarden voor de sleutel en poort komen overeen met de waarden die u eerder hebt ingesteld met BCDEdit op de doelcomputer.

    WinDbg –k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    
  7. Start het doelsysteem opnieuw op.

  8. Binnen een paar minuten moet de uitvoer voor foutopsporing worden weergegeven op het hostsysteem.

    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
    

Het Foutopsporingsopdrachtvenster is het primaire foutopsporingsinformatievenster in WinDbg. U kunt opdrachten voor foutopsporingsprogramma's invoeren en de uitvoer van de opdracht in dit venster weergeven.

Het venster van de foutopsporingsopdracht is verdeeld in twee deelvensters. Voer opdrachten in het kleinere deelvenster in. Dit is het opdrachtinvoervenster onder aan het venster en bekijk de uitvoer van de opdracht in het grotere deelvenster boven aan het venster.

Gebruik in het opdrachtinvoervenster de pijl-omhoog en pijl-omlaag om door de opdrachtgeschiedenis te bladeren. Wanneer een opdracht wordt weergegeven, kunt u deze bewerken of op Enter drukken om de opdracht uit te voeren.

Opdrachten en technieken voor foutopsporing in kernelmodus

In deze sectie gebruikt u foutopsporingsopdrachten om informatie over het doelsysteem weer te geven.

Sommige foutopsporingsopdrachten geven tekst weer met behulp van DML (Debugger Markup Language) die u kunt selecteren om snel meer informatie te verzamelen.

  1. Gebruik Op het hostsysteem Ctrl+Scroll Lock in WinDBg om in te breken in de code die op het doelsysteem wordt uitgevoerd. Het kan enige tijd duren voordat het doelsysteem reageert.

    hoofdscherm van het foutopsporingsprogramma met opdrachtvenster-uitvoer van een live kernelverbinding.

  2. Voer de volgende opdracht in om DML in te schakelen in het Debugger-opdrachtvenster:

    0: kd> .prefer_dml 1
    DML versions of commands on by default
    
  3. U kunt de help van de referentieopdracht openen met behulp van de opdracht .hh. Voer de volgende opdracht in om de referentie-help voor opdracht .prefer_dmlweer te geven:

    0: kd> .hh .prefer_dml
    

    Het helpbestand van de debugger geeft hulp weer voor de opdracht .prefer_dml.

    Schermopname van de debugger help-toepassing, waarin hulp wordt getoond voor de .prefer-dml opdracht.

  4. Als u gedetailleerde versie-informatie op het doelsysteem wilt weergeven, voert u de vertarget (Doelcomputerversie weergeven) opdracht in het WinDbg-venster in:

    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. Als u wilt controleren of u met het juiste kernelmodusproces werkt, voert u de lm (Loaded Modules list) opdracht in het WinDbg-venster in om de geladen modules weer te geven:

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

    Uitvoer die is weggelaten, wordt aangegeven met '...' in dit lab.

  6. Als u gedetailleerde informatie over een specifieke module wilt aanvragen, gebruikt u de optie v (uitgebreid):

    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
    

    Er zijn geen ingestelde symboolpaden en geladen symbolen, dus er is beperkte informatie beschikbaar in het foutopsporingsprogramma.

Het KMDF-echostuurprogramma downloaden en bouwen

In deze sectie downloadt en bouwt u het KMDF-echostuurprogramma.

Normaal gesproken werkt u met uw eigen stuurprogrammacode wanneer u WinDbg gebruikt. Om vertrouwd te raken met WinDbg-bewerking, gebruikt dit lab het voorbeeldstuurprogramma voor KMDF-sjabloon Echo. De broncode is beschikbaar om inzicht te verkrijgen in de informatie die wordt weergegeven in WinDbg. Dit voorbeeld wordt ook gebruikt om te illustreren hoe u systeemeigen kernelmoduscode met één stap kunt doorlopen. Deze techniek kan waardevol zijn voor het opsporen van problemen met complexe kernelmoduscode.

Download en bouw het Echo-voorbeeldstuurprogramma:

  1. Download eerst de KMDF Echo Sample van GitHub en pak deze uit.

    Het KMDF Echo-voorbeeld bevindt zich in de algemene map .

    Schermopname van de GitHub-pagina met voorbeelden van Windows-stuurprogramma's, waarin de algemene map wordt gemarkeerd en de download-zipknop wordt gemarkeerd.

    1. Download de stuurprogrammavoorbeelden in één zip-bestand: stuurprogrammavoorbeelden

    2. Download het zip-bestand naar uw lokale harde schijf.

    3. Selecteer en houd het zip-bestand ingedrukt of klik er met de rechtermuisknop op en selecteer Alleextraheren. Geef een nieuwe map op of blader naar een bestaande map om de uitgepakte bestanden op te slaan. U kunt bijvoorbeeld C:\DriverSamples\ opgeven als de nieuwe map waarin de bestanden moeten worden geëxtraheerd.

    4. Nadat de bestanden zijn uitgepakt, gaat u naar de volgende submap: C:\DriverSamples\general\echo\kmdf

  2. Selecteer in Microsoft Visual Studio File>Open>Project/Solution... en ga naar de map met de uitgepakte bestanden, bijvoorbeeld C:\DriverSamples\general\echo\kmdf. Dubbelklik op het kmdfecho-oplossingsbestand om het te openen.

    Zoek in Visual Studio naar de Oplossingsverkenner. Als dit venster nog niet is geopend, selecteert u Solution Explorer uit het menu Weergave. In Solution Explorer ziet u één oplossing met drie projecten.

    Schermopname van Visual Studio met het bestand device.c dat is geladen vanuit het kmdfecho-project.

  3. Stel de configuratie en het platform van het voorbeeld in. Selecteer en houd vast of klik met de rechtermuisknop op Solution 'kmdfecho' (3 projecten)en selecteer Configuration Manager. Zorg ervoor dat de configuratie- en platforminstellingen hetzelfde zijn voor de drie projecten. De configuratie is standaard ingesteld op Win10-foutopsporingen het platform is ingesteld op Win64- voor alle projecten. Als u configuratie- of platformwijzigingen voor één project aanbrengt, brengt u dezelfde wijzigingen aan voor de resterende drie projecten.

  4. Stuurprogramma-voorbeelden moeten worden gewijzigd om waarden te gebruiken die niet overlappen met bestaande stuurprogramma's. Raadpleeg Van voorbeeldcode naar productiestuurprogramma: wat u kunt wijzigen in de voorbeelden over het maken van een uniek stuurprogrammavoorbeeld dat naast bestaande echte stuurprogramma's in Windows wordt geïnstalleerd.

  5. Stel de runtimebibliotheek in. Open de Eigenschappenpagina van het echostuurprogramma en zoek C/C++>Codegeneratie. Wijzig de runtimebibliotheek naar Multi-threaded Debug (/MTd). Zie voor meer informatie over de buildopties /MD, /MT, /LD (Gebruik Run-Time Library).

    Schermopname van de pagina met echo-eigenschappen in Visual Studio waarin de instelling voor de runtime-bibliotheek wordt gemarkeerd.

  6. Controleer in de eigenschappen van het stuurprogramma of Driver Signing>Sign Mode is ingesteld op Test Sign.

    Schermopname van de pagina echo-eigenschap in Visual Studio waarin de instelling voor de tekenmodus wordt gemarkeerd.

  7. Selecteer in Visual Studio Build>Build Solution.

    In de buildvensters moet een bericht worden weergegeven waarin wordt aangegeven dat de build voor alle drie de projecten is geslaagd.

Fooi

Als er een buildfout wordt weergegeven, gebruikt u het buildfoutnummer om een oplossing te bepalen. Bijvoorbeeld, MSBuild-fout MSB8040 beschrijft hoe te werken met spectre-beveiligde bibliotheken.

  1. Ga in Verkenner naar de map met de uitgepakte bestanden voor het voorbeeld. Ga bijvoorbeeld naar C:\DriverSamples\general\echo\kmdf, als dat de map is die u eerder hebt opgegeven. Binnen die map is de locatie van de gecompileerde stuurprogrammabestanden afhankelijk van de configuratie- en platforminstellingen die u in Configuration Manager hebt geselecteerd. Als u de standaardinstellingen ongewijzigd hebt gelaten, worden de gecompileerde stuurprogrammabestanden opgeslagen in een map met de naam \x64\Debug voor een 64-bits foutopsporingsbuild.

    Ga naar de map met de ingebouwde bestanden voor het autosynchrone stuurprogramma: C:\DriverSamples\general\echo\kmdf\driver\AutoSync\x64\Debug.

    De map moet deze bestanden bevatten:

    Bestand Beschrijving
    Echo.sys Het stuurprogrammabestand.
    Echo.inf Een informatiebestand (INF) dat informatie bevat die nodig is om het stuurprogramma te installeren.

    Het echoapp.exe-bestand is ook gebouwd en moet zich hier bevinden: C:\DriverSamples\general\echo\kmdf\exe\x64\Debug.

    Bestand Beschrijving
    EchoApp.exe Een uitvoerbaar testbestand voor de opdrachtprompt dat communiceert met het echo.sys-stuurprogramma.
  2. Zoek een USB-duimstation of stel een netwerkshare in om de ingebouwde stuurprogrammabestanden en de test EchoApp- van de host naar het doelsysteem te kopiëren.

Kopieer in de volgende sectie de code naar het doelsysteem en installeer en test het stuurprogramma.

Het voorbeeld van het KMDF-echostuurprogramma installeren op het doelsysteem

In deze paragraaf gebruikt u de DevCon-tool om het echovoorbeeldstuurprogramma te installeren.

De computer waarop u het stuurprogramma installeert, wordt de doelcomputer of de testcomputergenoemd. Deze computer staat doorgaans los van de computer waarop u het stuurprogrammapakket ontwikkelt en bouwt. De computer waarop u het stuurprogramma ontwikkelt en bouwt, wordt de hostcomputergenoemd.

Het proces voor het verplaatsen van het stuurprogrammapakket naar de doelcomputer en het installeren van het stuurprogramma wordt het implementeren van het stuurprogramma genoemd.

Voordat u een ondertekend teststuurprogramma implementeert, bereidt u de doelcomputer voor door testondertekening in te schakelen. U moet ook het DevCon-hulpprogramma vinden in uw WDK-installatie en dat kopiëren naar het doelsysteem.

Voer de volgende stappen uit om het stuurprogramma op het doelsysteem te installeren.

Schakel op het doelsysteem testondertekende stuurprogramma's in:

  1. Open Windows-instellingen.

  2. Selecteer Herstelin Update en Beveiliging.

  3. Onder Geavanceerde opstart, selecteer Nu opnieuw opstarten.

  4. Wanneer de computer opnieuw wordt opgestart, selecteert u Opstartopties. Selecteer in Windows 10 Problemen oplossen>Geavanceerde opties>opstartinstellingen en selecteer vervolgens opnieuw opstarten.

  5. Selecteer Schakel het afdwingen van stuurprogrammahandtekeningen uit door op de F7-toets te drukken.

  6. Start de doelcomputer opnieuw op.

Ga op het hostsysteem naar de map Tools in uw WDK-installatie en zoek het DevCon-hulpprogramma. Zoek bijvoorbeeld in de volgende map: C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe.

Maak een map op het doel voor het ingebouwde stuurprogrammapakket, bijvoorbeeld C:\EchoDriver. Kopieer devcon.exe naar het doelsysteem. Zoek het .cer-certificaat op het hostsysteem. Deze bevindt zich in dezelfde map op de hostcomputer in de map die de ingebouwde stuurprogrammabestanden bevat. Kopieer alle bestanden van het ingebouwde stuurprogramma dat eerder op de hostcomputer is beschreven en sla ze op in dezelfde map die u op de doelcomputer hebt gemaakt.

Selecteer en houd op de doelcomputer het certificaatbestand ingedrukt of klik er met de rechtermuisknop op en selecteer Installerenen volg de aanwijzingen om het testcertificaat te installeren.

Zie Een computer voorbereiden voor handmatige implementatie van stuurprogramma'sals u meer gedetailleerde instructies nodig hebt voor het instellen van de doelcomputer.

In de volgende instructies ziet u hoe u het voorbeeldstuurprogramma installeert en test. Hier volgt de algemene syntaxis voor het devcon-hulpprogramma dat u gebruikt om het stuurprogramma te installeren:

devcon install <INF file> <hardware ID>

Het INF-bestand dat is vereist voor het installeren van dit stuurprogramma, is echo.inf. Het inf-bestand bevat de hardware-id voor het installeren van de echo.sys. Voor het echovoorbeeld is de hardware-id root\ECHO.

Open op de doelcomputer een opdrachtpromptvenster als administrator. Ga naar de map voor het stuurprogrammapakket en voer de volgende opdracht in:

devcon install echo.inf root\ECHO

Als u een foutmelding krijgt dat devcon niet wordt herkend, probeer dan het pad naar het devcon hulpprogramma toe te voegen. Als u deze bijvoorbeeld hebt gekopieerd naar een map met de naam C:\Tools, gebruikt u de volgende opdracht:

c:\tools\devcon install echo.inf root\ECHO

Er wordt een dialoogvenster weergegeven dat aangeeft dat het teststuurprogramma een niet-ondertekend stuurprogramma is. Kies Installeer dit stuurprogramma toch om door te gaan.

Schermopname van windows-beveiligingswaarschuwing waarin staat dat Windows de uitgever van stuurprogrammasoftware niet kan verifiëren.

Fooi

 Als u problemen ondervindt met de installatie, controleert u het volgende bestand voor meer informatie. %windir%\inf\setupapi.dev.log

Nadat het voorbeeldstuurprogramma is geïnstalleerd, kunt u het testen.

Voer op de doelcomputer in een opdrachtpromptvenster devmgmt- in om Apparaatbeheer te openen. Kies in Apparaatbeheer in het menu WeergaveApparaten per type. Zoek in de apparaatstructuur het voorbeeld WDF-echostuurprogramma in het knooppunt Voorbeeldapparaat.

Schermopname van de apparaatbeheerstructuur waarin het WDF-echostuurprogramma wordt gemarkeerd.

Voer echoapp- in om de test-echo-app te starten om te bevestigen dat het stuurprogramma functioneel is.

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

WinDbg gebruiken om informatie over het stuurprogramma weer te geven

In deze sectie stelt u het symboolpad in en gebruikt u kernelfoutopsporingsprogrammaopdrachten om informatie weer te geven over het KMDF-echovoorbeeldstuurprogramma.

Informatie over het stuurprogramma weergeven:

  1. Als u het foutopsporingsprogramma op het hostsysteem hebt gesloten, opent u het opnieuw met behulp van de volgende opdracht in het opdrachtpromptvenster van de beheerder.

    WinDbg -k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    
  2. Gebruik Ctrl+Break (Scroll Lock) om in te breken in de code die wordt uitgevoerd op het doelsysteem.

  3. Gebruik de opdracht .symfix om het pad naar de Microsoft-symboolserver in de WinDbg-omgeving in te stellen.

    0: kd> .symfix
    
  4. Als u uw lokale symboollocatie wilt toevoegen om uw lokale symbolen te gebruiken, voegt u het pad toe met behulp van .sympath+ en .reload /f.

    0: kd> .sympath+ C:\DriverSamples\general\echo\kmdf
    0: kd> .reload /f
    

    Met de opdracht .reload in combinatie met de optie /f worden alle symboolgegevens voor de opgegeven module verwijderd en worden de symbolen opnieuw geladen. In sommige gevallen wordt met deze opdracht ook de module zelf opnieuw geladen of verwijderd.

U moet de juiste symbolen laden om geavanceerde functionaliteit te gebruiken die WinDbg biedt. Als u geen symbolen goed hebt geconfigureerd, ontvangt u berichten die aangeven dat er geen symbolen beschikbaar zijn wanneer u functionaliteit probeert te gebruiken die afhankelijk is van symbolen.

0:000> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type “.hh dbgerr005” for details.

Er zijn veel benaderingen die kunnen worden gebruikt om te werken met symbolen. In veel situaties kunt u de computer zo configureren dat deze toegang heeft tot symbolen vanaf een symboolserver die Microsoft biedt wanneer ze nodig zijn. In dit lab wordt die benadering gebruikt. Als de symbolen in uw omgeving zich op een andere locatie bevinden, wijzigt u de stappen om die locatie te gebruiken. Zie Symboolpad voor windows-foutopsporingsprogrammavoor meer informatie.

Als u bronopsporing wilt uitvoeren, moet u een gecontroleerde (foutopsporings) versie van uw binaire bestanden bouwen. De compiler maakt symboolbestanden (.pdb bestanden). Deze symboolbestanden tonen het foutopsporingsprogramma hoe de binaire instructies overeenkomen met de bronlijnen. De werkelijke bronbestanden zelf moeten ook toegankelijk zijn voor het foutopsporingsprogramma.

De symboolbestanden bevatten niet de tekst van de broncode. Voor foutopsporing is het raadzaam als de linker uw code niet optimaliseert. Bronopsporing en toegang tot lokale variabelen zijn moeilijker en soms bijna onmogelijk, als de code is geoptimaliseerd. Als u problemen ondervindt bij het weergeven van lokale variabelen of bronlijnen, stelt u de volgende buildopties in:

set COMPILE_DEBUG=1
set ENABLE_OPTIMIZER=0
  1. Voer de volgende opdracht in het opdrachtgebied van het foutopsporingsprogramma in om informatie over het echostuurprogramma weer te geven:

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

    Zie lmvoor meer informatie.

  2. Omdat deze labset eerder met prefer_dml is ingesteld, zijn sommige elementen van de uitvoer hyperlinks die u kunt selecteren. Selecteer de koppeling Blader door alle globale symbolen in de uitvoer voor foutopsporing om informatie weer te geven over symbolen van items die beginnen met de letter "a".

    0: kd> x /D Echo!a*
    
  3. Het echovoorbeeld bevat geen symbolen die beginnen met de letter 'a', dus typ x ECHO!Echo* om informatie weer te geven over alle symbolen die zijn gekoppeld aan het echostuurprogramma die beginnen met '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__ *)
    ...
    

    Zie x (Symbolen onderzoeken)voor meer informatie.

  4. De !lmi-extensie bevat gedetailleerde informatie over een module. Voer !lmi echoin. De uitvoer moet vergelijkbaar zijn met de tekst die in dit voorbeeld wordt weergegeven:

    0: kd> !lmi echo
    Loaded Module Info: [echo] 
             Module: ECHO
       Base Address: fffff8010bf94000
         Image Name: ECHO.sys
    … 
    
  5. Gebruik de !dh-extensie om koptekstinformatie weer te geven, zoals wordt weergegeven in dit voorbeeld:

    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. Voer het volgende in om het standaardmasker voor foutopsporingsbits te wijzigen, zodat alle foutopsporingsberichten van het doelsysteem worden weergegeven in het foutopsporingsprogramma:

    0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
    

    Sommige stuurprogramma's geven aanvullende informatie weer wanneer het masker van 0xFFFFFFFF wordt gebruikt. Stel het masker in op 0x00000000 als u de hoeveelheid informatie wilt verminderen die wordt weergegeven.

    0: kd> ed nt!Kd_DEFAULT_MASK 0x00000000
    

    Gebruik de opdracht dd om te bevestigen dat het masker is ingesteld om alle foutopsporingsprogrammaberichten weer te geven.

    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
    

Informatie over de Plug and Play-apparatenboom weergeven

In deze sectie geeft u informatie weer over het echovoorbeeldstuurprogramma en waar het zich in de plug- en play-apparaatstructuur bevindt.

Informatie over het apparaatstuurprogramma in de plug- en play-apparaatstructuur kan handig zijn voor het oplossen van problemen. Als een apparaatstuurprogramma bijvoorbeeld niet aanwezig is in de apparaatboom, kan er een probleem zijn met de installatie van het stuurprogramma.

Zie !devnodevoor meer informatie over de extensie voor foutopsporing van apparaatknooppunten.

  1. Voer op het hostsysteem de opdracht !devnode 0 1 in om alle apparaatknooppunten in de plug en play-apparaatstructuur weer te geven.

    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. Gebruik Ctrl+F om te zoeken in de uitvoer die wordt gegenereerd om te zoeken naar de naam van het apparaatstuurprogramma, echo.

    Schermafbeelding van het dialoogvenster Zoeken in WinDbg die zoekt naar de term 'echo'.

  3. Het stuurprogramma van het echoapparaat moet worden geladen. Gebruik de opdracht !devnode 0 1 echo om Plug en Play-informatie weer te geven die is gekoppeld aan uw echoapparaatstuurprogramma, zoals wordt weergegeven in dit voorbeeld:

    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. De uitvoer die in de vorige opdracht wordt weergegeven, bevat de PDO die is gekoppeld aan het actieve exemplaar van uw stuurprogramma, in dit voorbeeld 0xffffe0007b71a960. Voer de opdracht !devobj <PDO address> in om Plug en Play-informatie weer te geven die is gekoppeld aan het echoapparaatstuurprogramma. Gebruik het PDO-adres dat !devnode op uw computer weergeeft, niet het adres dat hier staat.

    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. De uitvoer die wordt weergegeven in de opdracht !devnode 0 1 bevat het PDO-adres dat is gekoppeld aan het actieve exemplaar van uw stuurprogramma, in dit voorbeeld is het 0xffffe0007b71a960. Voer de !devstack <PDO address> opdracht in om Plug en Play-informatie weer te geven die is gekoppeld aan het apparaatstuurprogramma. Gebruik het PDO-adres dat op uw computer door !devnode wordt weergegeven, niet degene dat in dit voorbeeld wordt getoond.

    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"
    

In de uitvoer ziet u dat u een redelijk eenvoudige stack voor apparaatstuurprogramma's hebt. Het echostuurprogramma is een onderliggend element van het PnPManager-knooppunt. PnPManager- is een hoofdknooppunt.

\Driver\ECHO
\Driver\PnpManager

In dit diagram ziet u een complexere apparaatknooppuntboom.

diagram dat een apparaatknooppuntstructuur illustreert die bestaat uit ongeveer 20 knooppunten.

Zie Stuurprogrammastacks en Apparaatknooppunten en apparaatstacksvoor meer informatie over complexere stuurprogrammastacks.

Werken met onderbrekingspunten en broncode

In deze sectie stelt u onderbrekingspunten in en voert u stap voor stap de broncode voor de kernelmodus uit.

Als u code wilt doorlopen en de waarden van variabelen in realtime wilt controleren, schakelt u onderbrekingspunten in en stelt u een pad in op de broncode.

Breekpunten stoppen de uitvoering van code op een specifieke regel. Stap vooruit in de code vanaf dat punt om fouten op te sporen in die specifieke sectie van code.

Als u een onderbrekingspunt wilt instellen met behulp van een foutopsporingsopdracht, gebruikt u een van de volgende b opdrachten.

Bevelen Beschrijving
bp Hiermee stelt u een onderbrekingspunt in dat actief is totdat de module waarin deze zich bevindt, wordt uitgeladen.
bu Hiermee stelt u een onderbrekingspunt in dat zich in een ongeldige status bevindt wanneer de module is uitgeladen, en dat opnieuw geactiveerd wordt wanneer de module opnieuw geladen wordt.
bm Hiermee stelt u een onderbrekingspunt in voor een symbool. Deze opdracht gebruikt bu of bp op de juiste manier en staat toe dat jokertekens (*) worden gebruikt om onderbrekingspunten in te stellen voor elk symbool dat overeenkomt, zoals alle methoden in een klasse.

Zie broncodeopsporing in WinDbgvoor meer informatie.

  1. Gebruik op het hostsysteem de WinDbg-gebruikersinterface om te bevestigen dat Foutopsporing>Source Mode is ingeschakeld in de huidige WinDbg-sessie.

  2. Voer de volgende opdracht in om uw lokale codelocatie toe te voegen aan het bronpad:

    .srcpath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
    
  3. Voer de volgende opdracht in om uw lokale symboollocatie toe te voegen aan het pad naar het symbool:

    .sympath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
    
  4. Gebruik de opdracht x om de symbolen te onderzoeken die zijn gekoppeld aan het echostuurprogramma om de functienaam te bepalen die moet worden gebruikt voor het onderbrekingspunt. U kunt een jokerteken of Ctrl+F gebruiken om de naam van de DeviceAdd functie te zoeken.

    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 
    …
    

    De uitvoer toont dat de DeviceAdd-methode voor uw echostuurprogramma ECHO!EchoEvtDeviceAddis.

    U kunt ook de broncode controleren om de functienaam voor uw onderbrekingspunt te vinden.

  5. Stel het onderbrekingspunt in met de opdracht bm met behulp van de naam van het stuurprogramma, gevolgd door de functienaam, bijvoorbeeld AddDevice, waar u het onderbrekingspunt wilt instellen, gescheiden door een uitroepteken. In dit lab wordt AddDevice gebruikt om te zien hoe het stuurprogramma wordt geladen.

    0: kd> bm ECHO!EchoEvtDeviceAdd
      1: fffff801`0bf9b1c0 @!"ECHO!EchoEvtDeviceAdd"
    

    U kunt verschillende syntaxis gebruiken in combinatie met het instellen van variabelen zoals <module>!<symbol>, <class>::<method>,'<file.cpp>:<line number>'of een aantal keren overslaan <condition> <#>. Zie Voorwaardelijke onderbrekingspunten in WinDbg en andere Windows-foutopsporingsprogramma'svoor meer informatie.

  6. Geef de huidige onderbrekingspunten weer om te bevestigen dat het onderbrekingspunt is ingesteld door de opdracht bl in te voeren:

    0: kd> bl
    1 e fffff801`0bf9b1c0     0001 (0001) ECHO!EchoEvtDeviceAdd
    

    De 'e' in de uitvoer die hier wordt weergegeven, geeft aan dat het onderbrekingspuntnummer 1 is ingeschakeld om te worden geactiveerd.

  7. Start de uitvoering van code opnieuw op het doelsysteem door de opdracht g (go) in te voeren.

  8. Open op het doelsysteem in Windows Apparaatbeheer met behulp van het pictogram of voer mmc devmgmt.mscin. Vouw in Apparaatbeheer het knooppunt Samples uit.

  9. Selecteer en houd ingedrukt of klik met de rechtermuisknop op de KMDF-echostuurprogramma-vermelding en selecteer Uitschakelen in het menu.

  10. Selecteer en houd vast of klik opnieuw met de rechtermuisknop op de KMDF-echostuurprogramma vermelding en selecteer inschakelen in het menu.

  11. Wanneer het stuurprogramma is ingeschakeld op het hostsysteem, moet het AddDevice- onderbrekingspunt voor foutopsporing worden geactiveerd. De uitvoering van de stuurprogrammacode op het doelsysteem moet worden gestopt. Wanneer het onderbrekingspunt wordt bereikt, moet de uitvoering worden gestopt aan het begin van de AddDevice routine. In de uitvoer van de opdracht voor foutopsporing wordt Breakpoint 1 hitweergegeven.

    Schermopname van WinDbg die voorbeeldcode lokale variabelen en opdrachtvensters weergeeft.

  12. Doorloop de coderegel per regel door de p opdracht in te voeren of op F10 te drukken totdat u het volgende einde van de AddDevice routine bereikt. Het accoladeteken (}) is gemarkeerd zoals getoond.

    Schermopname van het codevenster met de accolade gemarkeerd aan het begin van de AddDevice routine.

Bekijk in de volgende sectie de status van de variabelen nadat de DeviceAdd-code is uitgevoerd.

U kunt bestaande onderbrekingspunten wijzigen met behulp van de volgende opdrachten:

Bevelen Beschrijving
bl Onderbrekingspunten opsommen.
bc Hiermee wordt een onderbrekingspunt uit de lijst gewist. Gebruik bc * om alle onderbrekingspunten op te ruimen.
bd Hiermee schakelt u een onderbrekingspunt uit. Gebruik bd * om alle onderbrekingspunten uit te schakelen.
be Hiermee schakelt u een onderbrekingspunt in. Gebruik be * om alle onderbrekingspunten in te schakelen.

U kunt ook onderbrekingspunten wijzigen in de WinDbg-gebruikersinterface.

U kunt ook onderbrekingspunten instellen die worden geactiveerd wanneer een geheugenlocatie wordt geopend. Gebruik de opdracht ba (onderbreking bij toegang) met de volgende syntaxis:

ba <access> <size> <address> {options}
Optie Beschrijving
e uitvoeren: wanneer cpu een instructie ophaalt van het adres
r lezen/schrijven: wanneer de CPU leest of schrijft op het adres
w schrijven: wanneer de CPU naar het adres schrijft

U kunt op elk gewenst moment slechts vier onderbrekingspunten voor gegevens instellen. Het is aan u om ervoor te zorgen dat u uw gegevens correct uitlijnt om het onderbrekingspunt te activeren. Woorden moeten eindigen op adressen die deelbaar zijn door 2, dwords moeten deelbaar zijn door 4 en kwadraten met 0 of 8.

Als u bijvoorbeeld een onderbrekingspunt voor lezen/schrijven wilt instellen op een specifiek geheugenadres, kunt u een opdracht zoals in dit voorbeeld gebruiken.

ba r 4 0x0003f7bf0

U kunt de volgende opdrachten gebruiken om uw code te doorlopen met de bijbehorende korte knipsels van het toetsenbord die tussen haakjes worden weergegeven.

  • Onderbreken (Ctrl+Break). Met deze opdracht wordt een systeem onderbroken zolang het systeem wordt uitgevoerd en in communicatie met WinDbg is. De toetsencombinatie in de kernel debugger is Ctrl+C.
  • Uitvoeren naar cursor (F7 of Ctrl+F10). Plaats de cursor in een bron- of demontagevenster waar u de uitvoering wilt onderbreken en druk op F7. Code-uitvoering gaat tot dat punt. Als de uitvoering van de code het punt dat door de cursor wordt aangegeven niet bereikt, zou WinDbg niet stoppen. Deze situatie kan zich voordoen als een IF-instructie niet wordt uitgevoerd.
  • Uitvoeren (F5) Voer uit totdat je een onderbrekingspunt tegenkomt of er een gebeurtenis zoals een foutencontrole plaatsvindt.
  • Overslaan (F10) Met deze opdracht wordt de code-uitvoering één statement of één instructie tegelijk uitgevoerd. Als er een aanroep wordt aangetroffen, gaat de uitvoering verder zonder de aangeroepen routine in te voeren. Als de programmeertaal C of C++ is en WinDbg zich in de bronmodus bevindt, kan de bronmodus worden ingeschakeld of uitgeschakeld met behulp van Foutopsporing>bronmodus.
  • Stap in (F11). Deze opdracht lijkt op step-over, maar hierbij wordt de aanroep daadwerkelijk uitgevoerd in de aangeroepen routine.
  • Stap uit (Shift+F11). Deze opdracht zorgt ervoor dat de uitvoering doorgaat tot en afsluit bij de huidige routine of huidige plaats in de callstack. Deze opdracht is handig als u genoeg van de routine hebt gezien.

Zie broncodeopsporing in WinDbgvoor meer informatie.

Variabelen en aanroepstacks weergeven

In deze sectie geeft u informatie weer over variabelen en aanroepstacks.

In dit lab wordt ervan uitgegaan dat u met behulp van het eerder beschreven proces bent gestopt bij de AddDevice routine. Als u de hier weergegeven uitvoer wilt weergeven, herhaalt u de stappen die eerder zijn beschreven, indien nodig.

Gebruik op het hostsysteem om variabelen weer te geven de weergave>menu-item lokale om lokale variabelen weer te geven.

Schermopname van WinDbg met het venster lokale variabelen.

Voer ? <variable name>in om de locatie van een globaal variabeleadres te vinden.

  • Stap uit (Shift+F11): deze opdracht zorgt ervoor dat de uitvoering wordt uitgevoerd naar en wordt afgesloten van de huidige routine (huidige plaats in de aanroepstack). Dit is handig als u genoeg van de routine hebt gezien.

Zie broncode opsporen in WinDbg (klassiek) in de referentiedocumentatie voor foutopsporing voor meer informatie.

Sectie 8: Variabelen en aanroepstacks weergeven

in sectie 8 geeft u informatie weer over variabelen en aanroepstacks.

In dit lab wordt ervan uitgegaan dat u bent gestopt bij de AddDevice routine met behulp van het eerder beschreven proces. Als u de uitvoer hier wilt weergeven, herhaalt u de stappen die eerder zijn beschreven, indien nodig.

<- Op het hostsysteem

Variabelen weergeven

Gebruik de -weergave>lokale-menupunt om lokale variabelen weer te geven.

Schermopname van WinDbg met het venster lokale variabelen.

globale variabelen

U kunt de locatie van een adres van een globale variabele vinden door te typen? <naam van de variabele>.

lokale variabelen

U kunt de namen en waarden van alle lokale variabelen voor een bepaald frame weergeven door de opdracht dv te typen. Als u de namen en waarden van alle lokale variabelen voor een specifiek frame wilt weergeven, voert u de opdracht dv in:

0: kd> dv
         Driver = 0x00001fff`7ff9c838
     DeviceInit = 0xffffd001`51978190
         status = 0n0

De call stack is de keten van functie-aanroepen die hebben geleid tot de huidige locatie van de programmateller. De bovenste functie op de aanroepstack is de huidige functie, en de volgende functie is de functie die de huidige functie heeft aangeroepen, enzovoort.

Als u de aanroepstack wilt weergeven, gebruikt u de k* opdrachten.

Bevelen Beschrijving
kb Geeft de stack en de eerste drie parameters weer.
kp Geeft de stacks en de volledige lijst met parameters weer.
kn Hiermee kunt u de stapel zien met de framegegevens ernaast.
  1. Als u de aanroepstack beschikbaar wilt houden op het hostsysteem, selecteert u weergave>aanroepstack om deze weer te geven. Selecteer de kolommen boven aan het venster om de weergave van aanvullende informatie in te schakelen.

    Schermopname van WinDbg waarop het venster met aanroepstapels wordt weergegeven.

  2. Gebruik de opdracht kn om de aanroepstack weer te geven tijdens het opsporen van fouten in de voorbeeldadaptercode in een onderbrekingsstatus.

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

De aanroepstack laat zien dat de kernel (nt) de Plug and Play-code (PnP) heeft aangeroepen, die op zijn beurt de driverframeworkcode (WDF) heeft aangeroepen, die vervolgens de functie van de echostuurprogramma DeviceAdd heeft aangeroepen.

Processen en threads weergeven

In deze sectie geeft u informatie weer over de processen en threads die worden uitgevoerd in de kernelmodus.

Processen

U kunt procesgegevens weergeven of instellen met behulp van de extensie !process foutopsporingsprogramma. Stel een onderbrekingspunt in om het proces te onderzoeken dat wordt gebruikt wanneer een geluid wordt afgespeeld.

  1. Voer op het hostsysteem de dv opdracht in om de landinstellingenvariabelen te onderzoeken die zijn gekoppeld aan de EchoEvtIo routine:

    0: kd> dv ECHO!EchoEvtIo*
    ECHO!EchoEvtIoQueueContextDestroy
    ECHO!EchoEvtIoWrite
    ECHO!EchoEvtIoRead         
    
  2. Wis de vorige onderbrekingspunten met behulp van bc *:

    0: kd> bc *  
    
  3. Stel een symboolonderbrekingspunt in op de EchoEvtIo routines met behulp van de volgende opdracht:

    0: kd> bm ECHO!EchoEvtIo*
      2: aade5490          @!”ECHO!EchoEvtIoQueueContextDestroy”
      3: aade55d0          @!”ECHO!EchoEvtIoWrite”
      4: aade54c0          @!”ECHO!EchoEvtIoRead”
    
  4. Vermeld de onderbrekingspunten om te bevestigen dat het onderbrekingspunt juist is ingesteld:

    0: kd> bl
    1 e aabf0490 [c:\Samples\kmdf echo sample\c++\driver\autosync\queue.c @ 197]    0001 (0001) ECHO!EchoEvtIoQueueContextDestroy
    ...
    
  5. Voer g in om de uitvoering van code opnieuw te starten:

    0: kd> g
    
  6. Voer het EchoApp.exe stuurprogrammatestprogramma uit op het doelsysteem.

  7. Wanneer de test-app wordt uitgevoerd, wordt de I/O-routine in het stuurprogramma aangeroepen op het hostsysteem. Deze aanroep zorgt ervoor dat het onderbrekingspunt wordt geactiveerd en dat de uitvoering van de stuurprogrammacode op het doelsysteem wordt gestopt.

    Breakpoint 2 hit
    ECHO!EchoEvtIoWrite:
    fffff801`0bf95810 4c89442418      mov     qword ptr [rsp+18h],r8
    
  8. Gebruik de opdracht !process om het huidige proces weer te geven dat betrokken is bij het uitvoeren van 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
    

    De uitvoer laat zien dat het proces is gekoppeld aan de echoapp.exe thread, die werd uitgevoerd toen uw onderbrekingspunt op de schrijfgebeurtenis van het stuurprogramma werd bereikt. Zie !procesvoor meer informatie.

  9. Gebruik de !process 0 0 om samenvattingsinformatie weer te geven voor alle processen. Gebruik Ctrl+F in de uitvoer om hetzelfde procesadres te vinden voor het proces dat is gekoppeld aan de echoapp.exe afbeelding. In het voorbeeld is het procesadres ffffe0007e6a7780.

    ...
    
    PROCESS ffffe0007e6a7780
        SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
        DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
        Image: echoapp.exe
    
    ...
    
  10. Noteer de proces-id die is gekoppeld aan echoapp.exe voor later gebruik in dit lab. U kunt ook Ctrl+C gebruiken om het adres naar de kopieerbuffer te kopiëren voor later gebruik.

    _____________________________________________________(echoapp.exe procesadres)

  11. Plaats g in de debugger om de code verder door te laten lopen tot echoapp.exe voltooid is. Het treft het onderbrekingspunt in de lees- en schrijfbeurtenis vaak. Wanneer echoapp.exe klaar is, meldt u zich aan bij het foutopsporingsprogramma door op Ctrl+ScrLk (Ctrl+Break) te drukken.

  12. Gebruik de opdracht !process om te bevestigen dat u een ander proces uitvoert. In de hier weergegeven uitvoer is het proces met de afbeeldingswaarde van System anders dan de afbeeldingswaarde van Echo.

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

    De uitvoer laat zien dat een systeemproces ffffe0007b65d900 werd uitgevoerd toen u het besturingssysteem stopte.

  13. Gebruik de opdracht !process om te kijken naar de proces-id die is gekoppeld aan echoapp.exe die u eerder hebt opgenomen. Geef uw echoapp.exe procesadres op dat u eerder hebt vastgelegd, in plaats van het voorbeeldprocesadres dat in dit voorbeeld wordt weergegeven.

    0: kd> !process ffffe0007e6a7780
    TYPE mismatch for process object at 82a9acc0
    

    Het procesobject is niet meer beschikbaar, omdat het echoapp.exe proces niet meer wordt uitgevoerd.

Draden

De opdrachten voor het weergeven en instellen van threads zijn vergelijkbaar met de opdrachten voor processen. Gebruik de opdracht !thread om threads weer te geven. Gebruik .thread om de huidige threads in te stellen.

  1. Voer op het hostsysteem g in het foutopsporingsprogramma in om de uitvoering van code op het doelsysteem opnieuw te starten.

  2. Voer op het doelsysteem het EchoApp.exe stuurprogrammatestprogramma uit.

  3. Op het hostsysteem wordt het onderbrekingspunt bereikt en wordt de uitvoering van code gestopt.

    Breakpoint 4 hit
    ECHO!EchoEvtIoRead:
    aade54c0 55              push    ebp
    
  4. Als u de actieve threads wilt weergeven, voert u !threadin. Informatie die vergelijkbaar is met het volgende voorbeeld, moet worden weergegeven:

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

    Noteer de naam van de afbeelding van echoapp.exe. Dit geeft aan dat u de thread bekijkt die is gekoppeld aan de test-app.

  5. Gebruik de opdracht !process om te bepalen of deze thread de enige thread is die wordt uitgevoerd in het proces dat is gekoppeld aan echoapp.exe. Het threadnummer van de actieve thread in het proces is dezelfde thread waarop de !thread opdracht wordt weergegeven.

    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. Gebruik de opdracht !process 0 0 om het procesadres van twee gerelateerde processen te zoeken en dit procesadres hier vast te leggen.

    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
    …
    

    U kunt ook !process 0 17 gebruiken om gedetailleerde informatie over elk proces weer te geven. De uitvoer van deze opdracht kan uitgebreid zijn. De uitvoer kan worden doorzocht met Ctrl+F.

  7. Gebruik de opdracht !process om procesgegevens weer te geven voor beide processen waarop uw computer wordt uitgevoerd. Geef het procesadres op uit de uitvoer van uw !process 0 0, niet het adres dat in dit voorbeeld wordt weergegeven.

    Deze voorbeelduitvoer is bedoeld voor de cmd.exe proces-id die eerder is vastgelegd. De imagenaam voor deze proces-ID is 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
    ...
    

    Deze voorbeelduitvoer is bedoeld voor de echoapp.exe proces-id die eerder is vastgelegd.

    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. Noteer hier het eerste threadadres dat is gekoppeld aan de twee processen.

    Cmd.exe: ____________________________________________________

    EchoApp.exe: _________________________________________________

  9. Gebruik de opdracht !Thread om informatie over de huidige thread weer te geven.

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

    Zoals verwacht, is de huidige thread de thread die is gekoppeld aan echoapp.exe en heeft deze een actieve status.

  10. Gebruik de opdracht !Thread om informatie weer te geven over de thread die is gekoppeld aan cmd.exe proces. Geef het threadadres op dat u eerder hebt genoteerd.

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

    Deze thread is gekoppeld aan cmd.exe en heeft een wachtstatus.

  11. Geef het threadadres op van de wachtende CMD.exe thread om de context te wijzigen in die wachtende thread.

    0: kd> .Thread ffffe0007cf34880
    Implicit thread is now ffffe000`7cf34880
    
  12. Gebruik de opdracht k om de aanroepstack weer te geven die is gekoppeld aan de wachtthread.

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

    Aanroepstackelementen zoals KiCommitThreadWait aangeven dat deze thread niet wordt uitgevoerd zoals verwacht.

Zie de volgende verwijzingen voor meer informatie over threads en processen:

IRQL, registreert en beëindigt de WinDbg-sessie

In deze sectie geeft u het interrupt-aanvraagniveau (IRQL) en de inhoud van de registers weer.

De opgeslagen IRQL weergeven

De IRQL wordt gebruikt om de prioriteit van interrupt-onderhoud te beheren. Elke processor heeft een IRQL-niveau dat threads kunnen verhogen of verlagen. Onderbrekingen die optreden bij of onder de IRQL-instelling van de processor, worden gemaskeerd en verstoren de huidige bewerking niet. Onderbrekingen die zich boven de IRQL-instelling van de processor voordoen, hebben voorrang op de huidige bewerking.

Op het hostsysteem geeft de extensie !irql de IRQL weer op de huidige processor van de doelcomputer voordat de onderbreking van de debugger plaatsvond. Wanneer de doelcomputer inbreekt in de debugger, wordt de IRQL gewijzigd, maar de IRQL die net vóór de onderbreking van de debugger actief was, wordt opgeslagen en weergegeven door !irql.

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

De registers weergeven

Geef op het hostsysteem de inhoud van de registers voor de huidige thread op de huidige processor weer met behulp van de opdracht r (Registers).

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

U kunt ook de inhoud van de registers weergeven door Weergave>Registerste selecteren. Zie r (registers)voor meer informatie.

Het weergeven van de inhoud van de registers kan handig zijn bij het doorlopen van de uitvoering van de assemblytaalcode en in andere scenario's. Zie voor meer informatie over de disassemblage van assemblytaal, Geannoteerde x86 Disassemblage en Geannoteerde x64 Disassemblage.

Zie x86-architectuur en x64-architectuurvoor meer informatie over de inhoud van het register.

De WinDbg-sessie beëindigen

Als u het foutopsporingsprogramma gekoppeld wilt laten, maar aan het doel wilt werken, wist u eventuele onderbrekingspunten met behulp van bc *, zodat de doelcomputer geen verbinding probeert te maken met het foutopsporingsprogramma van de hostcomputer. Gebruik vervolgens de opdracht g om de doelcomputer weer te laten draaien.

Als u de foutopsporingssessie wilt beëindigen, schakelt u op het hostsysteem in het foutopsporingsprogramma in en voert u de opdracht qd (Afsluiten en loskoppelen) in of selecteert u Stop Debugging in het menu.

0: kd> qd

Zie Een foutopsporingssessie beëindigen in WinDbg-voor meer informatie.

Windows-foutopsporingsbronnen

Meer informatie is beschikbaar in Windows-foutopsporing. Sommige van deze boeken gebruiken eerdere versies van Windows, zoals Windows Vista, in hun voorbeelden, maar de concepten die worden besproken, zijn van toepassing op de meeste versies van Windows.

Zie ook