Delen via


Veranderende Contexten

Bij foutopsporing in de kernelmodus zijn er veel processen, threads en soms gebruikerssessies die tegelijkertijd worden uitgevoerd. Daarom zijn woordgroepen zoals 'virtueel adres 0x80002000' of 'het eax--register' dubbelzinnig. U moet de context opgeven waarin dergelijke zinnen kunnen worden begrepen.

Het foutopsporingsprogramma heeft vijf verschillende contexten die u kunt instellen tijdens het opsporen van fouten:

  1. De sessiecontext geeft de standaardgebruikerssessie aan.

  2. De procescontext bepaalt hoe het foutopsporingsprogramma virtuele adressen interpreteert.

  3. De adrescontext in de gebruikersmodus is bijna nooit rechtstreeks ingesteld. Deze context wordt automatisch ingesteld wanneer u de procescontext wijzigt.

  4. De registercontext bepaalt hoe het foutopsporingsprogramma registers interpreteert en bepaalt ook de resultaten van een stack-trace. Deze context wordt ook wel de threadcontextgenoemd, hoewel die term niet volledig nauwkeurig is. Een expliciete context is ook een type registercontext. Als u een expliciete context opgeeft, wordt die context gebruikt in plaats van de huidige registercontext.

  5. De lokale context bepaalt hoe het foutopsporingsprogramma lokale variabelen interpreteert. Deze context wordt ook wel de scopegenoemd.

sessie-context

Meerdere aanmeldingssessies kunnen tegelijkertijd worden uitgevoerd. Elke aanmeldingssessie heeft zijn eigen processen.

De extensie !session geeft alle aanmeldingssessies weer of wijzigt de huidige sessiecontext.

De sessiecontext wordt gebruikt door de !sprocess en !spoolused extensies wanneer het sessienummer wordt ingevoerd als "-2".

Wanneer de sessiecontext wordt gewijzigd, wordt de procescontext automatisch gewijzigd in het actieve proces voor die sessie.

procescontext

Elk proces heeft een eigen paginamap die registreert hoe virtuele adressen worden toegewezen aan fysieke adressen. Wanneer een thread binnen een proces wordt uitgevoerd, gebruikt het Windows-besturingssysteem deze paginamap om virtuele adressen te interpreteren.

Tijdens foutopsporing in de gebruikersmodus bepaalt het huidige proces de procescontext. Virtuele adressen die worden gebruikt in foutopsporingsprogrammaopdrachten, extensies en foutopsporingsinformatievensters, worden geïnterpreteerd met behulp van de paginamap van het huidige proces.

Tijdens foutopsporing in de kernelmodus kunt u de procescontext instellen met behulp van deopdracht.process (Procescontext instellen). Gebruik deze opdracht om te selecteren welke paginamap van het proces wordt gebruikt om virtuele adressen te interpreteren. Nadat u de procescontext hebt ingesteld, kunt u deze context gebruiken in elke opdracht die adressen gebruikt. U kunt zelfs onderbrekingspunten instellen op dit adres. Door een /i--optie op te geven in de opdracht .process om ingrijpende foutopsporing op te geven, kunt u ook het kernelfoutopsporingsprogramma gebruiken om onderbrekingspunten in de gebruikersruimte in te stellen.

U kunt ook onderbrekingspunten in de gebruikersmodus instellen vanuit het kernelfoutopsporingsprogramma met behulp van een processpecifiek onderbrekingspunt voor een kernelruimtefunctie. Stel strategische onderbrekingspunten in en wacht tot de juiste context wordt weergegeven.

De adrescontext in de gebruikersmodus maakt deel uit van de procescontext. Normaal gesproken hoeft u de adrescontext in de gebruikersmodus niet rechtstreeks in te stellen. Als u de procescontext instelt, wordt de adrescontext in de gebruikersmodus automatisch gewijzigd in de directorybasis van de relevante paginatabel voor het proces.

Wanneer u de procescontext instelt tijdens foutopsporing in de kernelmodus, blijft die procescontext behouden totdat een andere .process opdracht de context wijzigt. De adrescontext in de gebruikersmodus wordt ook bewaard totdat een .process- of .context-opdracht deze wijzigt. Deze contexten worden niet gewijzigd wanneer de doelcomputer wordt uitgevoerd en worden niet beïnvloed door wijzigingen in de registercontext of de lokale context.

Register Context

Elke thread heeft zijn eigen registerwaarden. Deze waarden worden opgeslagen in de CPU-registers wanneer de thread wordt uitgevoerd en worden opgeslagen in het geheugen wanneer een andere thread wordt uitgevoerd.

Tijdens foutopsporing in de gebruikersmodus bepaalt de huidige thread doorgaans de registercontext. Verwijzingen naar registers in foutopsporingsprogrammaopdrachten, extensies en foutopsporingsinformatievensters worden geïnterpreteerd volgens de registers van de huidige thread.

U kunt de registercontext wijzigen in een andere waarde dan de huidige thread terwijl u foutopsporing in de gebruikersmodus uitvoert met behulp van een van de volgende opdrachten:

.cxr (Display Context Record)

.ecxr (Uitzonderingscontextrecord weergeven)

Tijdens foutopsporing in de kernelmodus kunt u de registercontext beheren met behulp van verschillende foutopsporingsprogramma-opdrachten, waaronder de volgende opdrachten:

.thread (Registercontext instellen)

.cxr (Display Context Record)

.trap (Display Trap Frame)

Met deze opdrachten worden de waarden van de CPU-registers niet gewijzigd. In plaats daarvan haalt het foutopsporingsprogramma de opgegeven registercontext op van de locatie in het geheugen. Het foutopsporingsprogramma kan eigenlijk alleen de opgeslagen registerwaarden ophalen. (Andere waarden worden dynamisch ingesteld en worden niet opgeslagen. De opgeslagen waarden zijn voldoende om een stacktracering opnieuw te maken.

Nadat de registercontext is ingesteld, wordt de nieuwe registercontext gebruikt voor opdrachten die registerwaarden gebruiken, zoals k (Display Stack Backtrace) en r (Registers).

Wanneer u echter foutopsporing voor multiprocessorcomputers gebruikt, kunt u met sommige opdrachten een processor opgeven. (Zie multiprocessorsyntaxisvoor meer informatie over dergelijke opdrachten.) Als u een processor voor een opdracht opgeeft, gebruikt de opdracht de registercontext van de actieve thread op de opgegeven processor in plaats van de huidige registercontext, zelfs als de opgegeven processor de momenteel actieve processor is.

Als de registercontext niet overeenkomt met de huidige processormodusinstelling, produceren deze opdrachten onjuiste of betekenisloze uitvoer. Om de uitvoerfouten te voorkomen, mislukken opdrachten die afhankelijk zijn van de registerstatus totdat u de processormodus wijzigt zodat deze overeenkomt met de registercontext. Als u de processormodus wilt wijzigen, gebruikt u de opdracht .effmach (Effective Machine),

Als u de registercontext wijzigt, kan ook de lokale context worden gewijzigd. Op deze manier kan de registercontext van invloed zijn op de weergave van lokale variabelen.

Als er toepassingsuitvoering, stappen of tracering plaatsvindt, wordt de registercontext onmiddellijk opnieuw ingesteld zodat deze overeenkomt met de positie van de programmateller. In de gebruikersmodus wordt de registercontext ook opnieuw ingesteld als het huidige proces of de huidige thread wordt gewijzigd.

De registercontext is van invloed op stacktraceringen, omdat de stack-tracering begint op de locatie waarnaar het stackpointerregister (esp op een x86-processor) verwijst. Als de registercontext is ingesteld op een ongeldige of niet-toegankelijke waarde, kunnen stacktraceringen niet worden verkregen.

U kunt een processoronderbrekingspunt (gegevensonderbrekingspunt) toepassen op een specifieke registercontext met behulp van de .apply_dbp (Gegevensonderbrekingspunt toepassen op context) opdracht.

lokale context

Wanneer een programma wordt uitgevoerd, is de betekenis van lokale variabelen afhankelijk van de locatie van de programmateller, omdat het bereik van dergelijke variabelen alleen geldt voor de functie waarin ze zijn gedefinieerd.

Wanneer u foutopsporing in de gebruikersmodus of kernelmodus uitvoert, gebruikt het foutopsporingsprogramma het bereik van de huidige functie (het huidige frame op de stack) als de lokale context. Als u deze context wilt wijzigen, gebruikt u de opdracht .frame (Lokale context instellen) of dubbelklikt u op het gewenste frame in het venster Oproepen.

Bij foutopsporing in de gebruikersmodus is de lokale context altijd een frame binnen de stacktracering van de huidige thread. Bij debugging in de kernelmodus is de lokale context altijd een frame binnen de stack-trace van de thread van de huidige registercontext.

U kunt slechts één stackframe tegelijk gebruiken voor de lokale context. Lokale variabelen in andere frames kunnen niet worden geopend.

De lokale context wordt opnieuw ingesteld als een van de volgende gebeurtenissen optreedt:

  • Uitvoering, stappen of tracering van programma's

  • Elk gebruik van het threadscheidingsteken (~) in elke opdracht

  • Elke wijziging in de registercontext

Met de extensie !for_each_frame kunt u één opdracht herhaaldelijk uitvoeren, één keer voor elk frame in de stack. Met deze opdracht wijzigt u de lokale context voor elk frame, voert u de opgegeven opdracht uit en retourneert u vervolgens de lokale context naar de oorspronkelijke waarde.