Contrôle des threads et des processus

Pour obtenir une vue d’ensemble des threads et processus dans le moteur du débogueur, consultez threads et processus.

Lorsqu’un événement se produit, le thread d’événement et le processus d’événement sont définis sur le thread et le processus (système d’exploitation ou virtuel) dans lequel l’événement s’est produit. Vous pouvez les trouver à l’aide de GetEventThread et GetEventProcess, respectivement.

Threads et processus implicites

Dans le cadre du débogage en mode noyau, le moteur du débogueur utilise le processus implicite pour déterminer l’espace d’adressage virtuel à utiliser lors de la traduction d’adresses virtuelles en adresses physiques, par exemple dans les méthodes VirtualToPhysical et ReadVirtual,. Lorsqu’un événement se produit, le processus implicite est défini sur le processus actuel.

Le processus implicite peut être modifié à l’aide de SetImplicitProcessDataOffset. Pour déterminer le processus implicite, utilisez GetImplicitProcessDataOffset.

Remarque Lors de la définition de points d’arrêt pendant une session de débogage du noyau en direct, le moteur du débogueur passe l’adresse virtuelle du point d’arrêt à la cible, et la cible définit le point d’arrêt. Dans ce cas, seul le contexte de processus de la cible est utilisé lors de la gestion du point d’arrêt. la valeur du processus implicite n’est pas pertinente.

Dans le débogage en mode noyau, le moteur du débogueur utilise le thread implicite pour déterminer certains des registresde la cible. Cela comprend la pile de processeurs (consultez GetStackOffset), le décalage de frame (consultez GetFrameOffset) et le décalage d’instruction (consultez GetInstructionOffset). Lorsqu’un événement se produit, le thread implicite est défini sur le thread actuel.

Le thread implicite peut être modifié à l’aide de SetImplicitThreadDataOffset. Pour déterminer le thread implicite, utilisez GetImplicitThreadDataOffset.

Les registres ne sont pas tous déterminés par le thread implicite. Certains registres restent les mêmes lorsque le thread implicite est modifié.

Avertissement Le processus implicite et le thread implicite sont indépendants. Si le thread implicite n’appartient pas au processus implicite, l’état utilisateur et l’état de session du thread implicite se trouvent dans un espace d’adressage virtuel incorrect et les tentatives d’accès à ces informations entraînent des erreurs ou fournissent des résultats incorrects. Ce problème ne se produit pas lors de l’accès à la mémoire du noyau, car les adresses mémoire du noyau sont constantes dans tous les espaces d’adressage virtuels. Ainsi, les informations du thread implicite situées dans la mémoire du noyau sont accessibles indépendamment du processus implicite.

Thèmes

L' ID de thread du moteur est utilisé par le moteur du débogueur pour identifier chaque thread de système d’exploitation et chaque thread virtuel pour une cible.

Lorsqu’une cible est arrêtée, chaque thread a également un index relatif au processus auquel il appartient. Pour tout processus, l’index du premier thread dans le processus est égal à zéro, et l’index du dernier thread est le nombre de threads dans le processus moins un. Vous pouvez trouver le nombre de threads dans le processus en cours à l’aide de GetNumberThreads. Le nombre total de threads dans tous les processus de la cible actuelle peut être trouvé à l’aide de GetTotalNumberThreads.

L’ID de thread du moteur et l’ID de thread système d’un ou plusieurs threads dans le processus en cours sont accessibles à partir de leur index à l’aide de GetThreadIdsByIndex.

Le moteur gère plusieurs éléments d’information sur chaque thread. Ces informations peuvent être interrogées pour le thread actuel et peuvent être utilisées pour Rechercher l’ID de thread du moteur d’un thread.

ID de thread système (débogage en mode utilisateur uniquement)
L’ID de thread système du thread actuel est accessible à l’aide de GetCurrentThreadSystemId. Pour un ID de thread système donné, l’ID de thread de moteur correspondant peut être trouvé à l’aide de GetThreadIdBySystemId.

bloc d’environnement de thread (TEB)
L’adresse du TEB pour le thread actuel est accessible à l’aide de GetCurrentThreadTeb. Pour une adresse TEB donnée, l’ID de thread du moteur correspondant peut être trouvé à l’aide de GetThreadIdByTeb. Dans le cadre du débogage en mode noyau, le TEB d’un thread (virtuel) est le TEB du thread système qui s’exécutait sur le processeur correspondant lorsque le dernier événement s’est produit.

décalage des données
Dans le débogage en mode utilisateur, le décalage des données d’un thread (système) est l’emplacement du TEB pour ce thread. Dans le cadre du débogage en mode noyau, le décalage des données d’un thread (virtuel) est la structure KTHREAD pour le thread système qui s’exécutait sur le processeur correspondant lorsque le dernier événement s’est produit. Le décalage des données du thread actuel peut être trouvé à l’aide de GetCurrentThreadDataOffset. Pour un décalage de données donné, l’ID de thread du moteur correspondant peut être trouvé à l’aide de GetThreadIdByDataOffset.

handle du système
Le descripteur système du thread actuel peut être trouvé à l’aide de GetCurrentThreadHandle. Pour un handle système donné, l’ID de thread du moteur correspondant peut être trouvé à l’aide de GetThreadIdByHandle. En cas de débogage en mode noyau, un descripteur artificiel est créé pour chaque processus (virtuel). Ce handle ne peut être utilisé qu’avec les requêtes de l’API du moteur du débogueur.

Processus

L' ID de processus du moteur est utilisé par le moteur du débogueur pour identifier chaque processus du système d’exploitation et chaque processus virtuel pour une cible.

Lorsqu’une cible est arrêtée, chaque processus a un index relatif à la cible. L’index du premier processus dans la cible est égal à zéro, et l’index du dernier processus est le nombre de processus dans la cible moins un. Le nombre de processus dans la cible actuelle peut être trouvé à l’aide de GetNumberProcesses.

L’ID de processus du moteur et l’ID de processus système pour un ou plusieurs threads de la cible actuelle sont accessibles à partir de leur index à l’aide de GetProcessIdsByIndex.

Le moteur gère plusieurs éléments d’information sur chaque processus. Ces informations peuvent être interrogées pour le processus en cours et peuvent être utilisées pour Rechercher l’ID de processus du moteur d’un processus.

ID de processus système (débogage en mode utilisateur uniquement)
L’ID de processus système du processus en cours est disponible à l’aide de GetCurrentProcessSystemId. Pour un ID de processus système donné, l’ID de processus du moteur correspondant peut être trouvé à l’aide de GetProcessIdBySystemId.

bloc d’environnement de processus (PEB)
L’adresse du PEB pour le processus en cours est disponible à l’aide de GetCurrentProcessPeb. Pour une adresse PEB donnée, l’ID de processus du moteur correspondant peut être trouvé à l’aide de GetProcessIdByPeb. Dans le cadre du débogage en mode noyau, le PEB du processus (virtuel) est le PEB du processus système qui était en cours d’exécution lorsque le dernier événement s’est produit.

décalage des données
Dans le débogage en mode utilisateur, le décalage des données d’un processus (système) est l’emplacement du PEB de ce processus. En cas de débogage en mode noyau, le décalage des données du processus (virtuel) est la structure KPROCESS pour le processus système qui s’exécutait lorsque le dernier événement s’est produit. Vous pouvez trouver le décalage des données du processus en cours à l’aide de GetCurrentProcessDataOffset. Pour un décalage de données donné, l’ID de processus du moteur correspondant peut être trouvé à l’aide de GetProcessIdByDataOffset.

handle du système
Le descripteur système du processus en cours est disponible à l’aide de GetCurrentProcessHandle. Pour un handle système donné, l’ID de processus du moteur correspondant peut être trouvé à l’aide de GetProcessIdByHandle. En cas de débogage en mode noyau, un descripteur artificiel est créé pour le processus (virtuel). Ce handle ne peut être utilisé qu’avec les requêtes du moteur du débogueur.

Événements

Dans le débogage en mode utilisateur en direct, chaque fois qu’un thread est créé ou s’arrête dans une cible, les événements de débogage de création de thread et de sortie de thread sont générés. Ces événements entraînent des appels aux méthodes de rappel IDebugEventCallbacks :: CreateThread et IDebugEventCallbacks :: ExitThread .

Dans le débogage en mode utilisateur en direct, chaque fois qu’un processus est créé ou s’arrête dans une cible, les événements de débogage de création de processus et de sortie de processus sont générés. Ces événements entraînent des appels aux méthodes de rappel IDebugEventCallbacks :: CreateProcess et IDebugEventCallbacks :: ExitProcess .

Pour plus d’informations sur les événements, consultez surveillance des événements.

Informations supplémentaires

pour plus d’informations sur les threads et les processus, notamment les structures TEB, KTHREAD, PEB et KPROCESS, consultez Microsoft Windows internals de David Solomon et Mark Russinovich.