Dela via


Kontrollera trådar och processer

En översikt över trådar och processer i felsökningsmotorn finns i Trådar och processer.

När en händelse inträffar anges händelsetråden och händelseprocessen till den tråd och process (operativsystem eller virtuell) där händelsen inträffade. De kan hittas med hjälp av GetEventThread respektive GetEventProcess.

implicita trådar och processer

Vid felsökning i kernelläge använder felsökningsmotorn implicit process för att avgöra vilket virtuellt adressutrymme som ska användas när du utför översättning av virtuella till fysiska adresser, till exempel i metoderna VirtualToPhysical och ReadVirtual. När en händelse inträffar är den implicita processen inställd på den aktuella processen.

Den implicita processen kan ändras med hjälp av SetImplicitProcessDataOffset. För att fastställa implicit processanvändning, använd GetImplicitProcessDataOffset.

Observera När du ställer in brytpunkter under en realtidskrypteringssession skickar felsökningsmotorn den virtuella adressen för brytpunkten till målet och målet anger brytpunkten. I det här fallet används endast processkontexten för målet vid hantering av brytpunkten. värdet för den implicita processen är irrelevant.

Vid felsökning i kernelläge använder felsökningsmotorn implicit tråd för att fastställa några av målets registrerar. Detta inkluderar processorstacken (se GetStackOffset), ramförskjutningen (se GetFrameOffset) och instruktionsförskjutningen (se GetInstructionOffset). När en händelse inträffar är den implicita tråden inställd på den aktuella tråden.

Den implicita tråden kan ändras med hjälp av SetImplicitThreadDataOffset. För att fastställa den implicita tråden använder du GetImplicitThreadDataOffset.

Alla register bestäms inte av den implicita tråden. Vissa register förblir desamma när den implicita tråden ändras.

Varning Den implicita processen och den implicita tråden är oberoende. Om den implicita tråden inte tillhör den implicita processen kommer användar- och sessionstillståndet för den implicita tråden att finnas i fel virtuellt adressutrymme och försök att komma åt den här informationen orsakar fel eller ger felaktiga resultat. Det här problemet uppstår inte vid åtkomst till kernelminne, eftersom kernelminnesadresser är konstanta i alla virtuella adressutrymmen. Därför kan information för den implicita tråden som finns i kernelminnet nås oberoende av den implicita processen.

trådar

motortråd-ID används av felsökningsmotorn för att identifiera varje operativsystemtråd och varje virtuell tråd för ett målobjekt.

Medan ett mål stoppas har varje tråd också ett index i förhållande till den process som den tillhör. För alla processer är indexet för den första tråden i processen noll och indexet för den sista tråden är antalet trådar i processen minus en. Antalet trådar i den aktuella processen kan hittas med hjälp av GetNumberThreads. Det totala antalet trådar i alla processer i det aktuella målet kan hittas med hjälp av GetTotalNumberThreads.

Motorns tråd-ID och systemtråds-ID för en eller flera trådar i den aktuella processen kan erhållas från deras index med hjälp av GetThreadIdsByIndex.

Motorn lagrar flera informationsbitar om varje tråd. Den här informationen kan efterfrågas för den aktuella tråden och kan användas för att hitta motortråds-ID:t för en tråd.

systemtråds-ID (endast felsökning i användarläge)
Systemtråds-ID:t för den aktuella tråden kan hittas med hjälp av GetCurrentThreadSystemId. För ett givet systemtråds-ID kan motsvarande motortråds-ID hittas med hjälp av GetThreadIdBySystemId.

trådmiljöblock (TEB)
Adressen till TEB för den aktuella tråden kan hittas med hjälp av GetCurrentThreadTeb. För en viss TEB-adress kan motsvarande motortråds-ID hittas med hjälp av GetThreadIdByTeb. Vid felsökning i kernelläge är TEB för en (virtuell) tråd TEB för systemtråden som kördes på motsvarande processor när den senaste händelsen inträffade.

dataförskjutning
Vid felsökning i användarläge är dataförskjutningen för en systemtråd den plats där TEB för den tråden ligger. I felsökning i kernelläge är dataoffseten för en (virtuell) tråd KTHREAD-strukturen för systemtråden som kördes på motsvarande processor när den senaste händelsen inträffade. Dataförskjutningen för den aktuella tråden kan hittas med hjälp av GetCurrentThreadDataOffset. För en viss dataförskjutning kan motsvarande motortråds-ID hittas med hjälp av GetThreadIdByDataOffset.

systemhandtag
Systemhandtaget för den aktuella tråden kan hittas med hjälp av GetCurrentThreadHandle. För ett visst systemhandtag kan motsvarande motortråds-ID hittas med hjälp av GetThreadIdByHandle. Vid felsökning i kernelläge skapas ett artificiellt handtag för varje (virtuell) process. Det här handtaget kan endast användas med felsökningsmotor-API-frågor.

Processer

motorns process-ID används av felsökningsmotorn för att identifiera varje operativsystemprocess och varje virtuell process för ett mål.

När ett mål stoppas har varje process ett index i förhållande till målet. Indexet för den första processen i målet är noll och indexet för den senaste processen är antalet processer i målet minus en. Antalet processer i det aktuella målet kan hittas med hjälp av GetNumberProcesses.

Processorns process-ID och systemprocess-ID för en eller flera trådar i den aktuella målenheten kan hittas från deras index med hjälp av GetProcessIdsByIndex.

Motorn lagrar flera bitar av information om varje process. Den här informationen kan efterfrågas för den aktuella processen och kan användas för att hitta motorprocess-ID:t för en process.

systemprocess-ID (endast felsökning i användarläge)
Systemprocess-ID för den aktuella processen kan hittas med hjälp av GetCurrentProcessSystemId. För ett visst systemprocess-ID kan motsvarande motorprocess-ID hittas med hjälp av GetProcessIdBySystemId.

processmiljöblock (PEB)
Adressen till PEB för den aktuella processen kan hittas med hjälp av GetCurrentProcessPeb. För en viss PEB-adress kan motsvarande motorprocess-ID hittas med hjälp av GetProcessIdByPeb. Vid felsökning i kernelläge är PEB för den (virtuella) processen den PEB som tillhörde systemprocessen som var igång när den senaste händelsen inträffade.

dataförskjutning
Vid felsökning i användarläge är dataförskjutningen för en systemprocess platsen för PEB för den processen. Vid felsökning i kernelläge är dataförskjutningen för den (virtuella) processen KPROCESS-strukturen för systemprocessen som kördes när den senaste händelsen inträffade. Dataförskjutningen för den aktuella processen kan hittas med hjälp av GetCurrentProcessDataOffset. För en viss dataförskjutning kan motsvarande motorprocess-ID hittas med hjälp av GetProcessIdByDataOffset.

systemhandtag
Systemhandtaget för den aktuella processen kan hittas med hjälp av GetCurrentProcessHandle. För ett visst systemhandtag kan motsvarande motorprocess-ID hittas med hjälp av GetProcessIdByHandle. Vid felsökning i kernelläge skapas en artificiell hanterare för (den virtuella) processen. Det här handtaget kan bara användas för frågor i felsökningsmotorn.

händelser

Vid felsökning i live-användarläge genereras felsökningshändelserna create-thread och exit-thread när en tråd skapas eller avslutas i ett mål. Dessa händelser resulterar i anrop till IDebugEventCallbacks::CreateThread och IDebugEventCallbacks::ExitThread återanropsmetoder.

När en process skapas eller avslutas i en målprocess genereras felsökningshändelserna create-process och exit-process. Dessa händelser resulterar i anrop till IDebugEventCallbacks::CreateProcess och IDebugEventCallbacks::ExitProcess återanropsmetoder.

Mer information om händelser finns i Övervakningshändelser.

ytterligare information

Mer information om trådar och processer, inklusive TEB-, KTHREAD-, PEB- och KPROCESS-strukturerna, finns i Microsoft Windows Internals av David Solomon och Mark Russinovich.