Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Vid felsökning i kernelläge finns det många processer, trådar och ibland användarsessioner som körs samtidigt. Därför är fraser som "virtuell adress 0x80002000" eller " eax-registret " tvetydiga. Du måste ange i vilken kontext sådana fraser kan tolkas.
Felsökningsprogrammet har fem olika kontexter som du kan ange när du felsöker:
Sessionskontexten anger standardanvändarsessionen.
Processkontexten avgör hur felsökaren tolkar virtuella adresser.
Adresskontexten för användarläge har nästan aldrig angetts direkt. Den här kontexten anges automatiskt när du ändrar processkontexten.
Registerkontexten avgör hur felsökningsprogrammet tolkar register och styr även resultatet av en stackspårning. Den här kontexten kallas även trådkontext, även om termen inte är helt korrekt. En explicit kontext är också en typ av registerkontext. Om du anger en explicit kontext används kontexten i stället för den aktuella registerkontexten.
Den lokala kontexten avgör hur felsökningsprogrammet tolkar lokala variabler. Den här kontexten kallas även omfånget.
Sessionskontext
Flera inloggningssessioner kan köras samtidigt. Varje inloggningssession har egna processer.
! sessionstillägget visar alla inloggningssessioner eller ändrar den aktuella sessionskontexten.
Sessionskontexten används av tilläggen !sprocess och !spoolused när sessionsnumret anges som "-2".
När sessionskontexten ändras ändras processkontexten automatiskt till den aktiva processen för sessionen.
Processkontext
Varje process har en egen sidkatalog som registrerar hur virtuella adresser mappas till fysiska adresser. När en tråd i en process körs använder Windows-operativsystemet den här sidkatalogen för att tolka virtuella adresser.
Under felsökning i användarläge avgör den aktuella processen processkontexten. Virtuella adresser som används i felsökningskommandon, tillägg och felsökningsinformationsfönster tolkas med hjälp av sidkatalogen för den aktuella processen.
Under felsökning i kernelläge kan du ange processkontexten med hjälp av kommandot .process (Ange processkontext). Använd det här kommandot för att välja vilken process sidkatalog som ska användas för att tolka virtuella adresser. När du har angett processkontexten kan du använda den här kontexten i alla kommandon som tar adresser. Du kan till och med ange brytpunkter på den här adressen. Genom att inkludera ett /i-alternativ i .process-kommandot för att ange invasiv felsökning kan du också använda kernelfelsökaren för att ange brytpunkter i användarutrymmet.
Du kan också ange brytpunkter i användarläge från kernelfelsökaren med hjälp av en processspecifik brytpunkt på en kernel-space-funktion. Ange strategiska brytpunkter och vänta tills rätt kontext har kommit upp.
Adresskontexten för användarläge är en del av processkontexten. Normalt behöver du inte ange adresskontexten i användarläge direkt. Om du anger processkontexten ändras användarlägesadresskontexten automatiskt till katalogbasen för den relevanta sidtabellen för processen.
När du anger processkontexten under felsökning i kernelläge behålls processkontexten tills ett annat .process-kommando ändrar kontexten. Adresskontexten för användarläge behålls också tills ett .process - eller .context-kommando ändrar den. Dessa kontexter ändras inte när måldatorn körs, och de påverkas inte av ändringar i registerkontexten eller den lokala kontexten.
Registreringskontext
Varje tråd har sina egna registervärden. Dessa värden lagras i CPU-register när tråden körs och lagras i minnet när en annan tråd körs.
Vid felsökning i användarläge avgör den aktuella tråden vanligtvis registerkontexten. Alla referenser till register i felsökningskommandon, tillägg och felsökningsinformationsfönster tolkas enligt den aktuella trådens register.
Du kan ändra registerkontexten till ett annat värde än den aktuella tråden när du utför felsökning i användarläge med något av följande kommandon:
.ecxr (Visa undantagskontextpost)
Under felsökning i kernelläge kan du styra registerkontexten med hjälp av en mängd olika felsökningskommandon, inklusive följande kommandon:
.thread (Ange registerkontext)
Dessa kommandon ändrar inte värdena för CPU-register. I stället hämtar felsökningsprogrammet den angivna registerkontexten från dess plats i minnet. Felsökningsprogrammet kan faktiskt bara hämta de sparade registervärdena. (Andra värden anges dynamiskt och sparas inte. De sparade värdena räcker för att återskapa ett stackspår.
När registerkontexten har angetts används den nya registerkontexten för alla kommandon som använder registervärden, till exempel k (Display Stack Backtrace) och r (Register).
Men när du felsöker datorer med flera processorer kan du med vissa kommandon ange en processor. (Mer information om sådana kommandon finns i Syntax för flera processorer.) Om du anger en processor för ett kommando använder kommandot registerkontexten för den aktiva tråden på den angivna processorn i stället för den aktuella registerkontexten, även om den angivna processorn är den för närvarande aktiva processorn.
Om registerkontexten inte matchar den aktuella inställningen för processorläge ger dessa kommandon också felaktiga eller meningslösa utdata. För att undvika fel vid utdata kommer kommandon som är beroende av registertillståndet att misslyckas tills du ändrar processorläget så att det överensstämmer med registersammanhanget. Om du vill ändra processorläget använder du kommandot .effmach (Effective Machine),
Om du ändrar registerkontexten kan du också ändra den lokala kontexten. På så sätt kan registerkontexten påverka visningen av lokala variabler.
Om någon programkörning, stegning eller spårning sker återställs registerkontexten omedelbart för att matcha programräknarens position. I användarläge återställs även registerkontexten om den aktuella processen eller tråden ändras.
Registerkontexten påverkar stackspårningar eftersom stackspårningen börjar på den plats som stackpekarens register (esp på en x86-baserad processor) pekar på. Om registerkontexten är inställd på ett ogiltigt eller otillgängligt värde går det inte att hämta stackspårningar.
Du kan använda en processorbrytpunkt (databrytpunkt) till en specifik registerkontext med hjälp av kommandot .apply_dbp (Tillämpa databrytpunkt på kontext).
Lokal kontext
När ett program körs beror betydelsen av lokala variabler på platsen för programräknaren, eftersom omfånget för sådana variabler endast sträcker sig till den funktion som de definieras i.
När du utför felsökning i användarläge eller kernelläge använder felsökningsprogrammet omfånget för den aktuella funktionen (den aktuella ramen i stacken) som lokal kontext. Om du vill ändra den här kontexten använder du kommandot .frame (Ange lokal kontext) eller dubbelklickar på önskad ram i fönstret Samtal.
Vid felsökning i användarläge är den lokala kontexten alltid en ram i stackspårningen av den aktuella tråden. Vid felsökning i kernelläge är den lokala kontexten alltid en ram i stackspårningen av den aktuella registerkontextens tråd.
Du kan bara använda en stackram i taget för den lokala kontexten. Det går inte att komma åt lokala variabler i andra bildrutor.
Den lokala kontexten återställs om någon av följande händelser inträffar:
Alla programkörningar, steg eller spårning
All användning av trådavgränsaren (~) i vilket som helst kommando
Ändringar i registerkontexten
Med tillägget !for_each_frame kan du köra ett enda kommando upprepade gånger, en gång för varje bildruta i stacken. Det här kommandot ändrar den lokala kontexten för varje ram, kör det angivna kommandot och returnerar sedan den lokala kontexten till dess ursprungliga värde.