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.
Dans le débogage en mode noyau, le moteur de débogueur utilise le processus implicite pour déterminer l’espace d’adressage virtuel à utiliser lors de l’exécution 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.
Note Lorsque vous définissez des points d’arrêt pendant une session de débogage du noyau actif, le moteur de débogueur transmet 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 de débogueur utilise le thread implicite pour déterminer certains des registres de la cible. Cela inclut la pile du processeur (voir GetStackOffset), le décalage d’image (voir GetFrameOffset) et le décalage d’instruction (voir GetInstructionOffset). Lorsqu’un événement se produit, le thread implicite est défini sur le thread actif.
Le thread implicite peut être modifié à l’aide de SetImplicitThreadDataOffset. Pour déterminer le thread implicite, utilisez GetImplicitThreadDataOffset.
Tous les registres ne sont pas 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 de session du thread implicite se trouve 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é dans la mémoire du noyau peuvent être consultées indépendamment du processus implicite.
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 par rapport au processus auquel il appartient. Pour tout processus, l’index du premier thread du processus est égal à zéro, et l’index du dernier thread correspond au nombre de threads dans le processus moins un. Le nombre de threads dans le processus actuel est disponible à l’aide de GetNumberThreads. Le nombre total de threads dans tous les processus de la cible actuelle est disponible à 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 actuel sont disponibles à partir de leur index à l’aide de GetThreadIdsByIndex.
Le moteur conserve plusieurs informations 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 pour un thread.
ID de thread système (débogage en mode utilisateur uniquement)
L’ID de thread système du thread actuel est disponible à 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 du thread actuel est disponible à l’aide de GetCurrentThreadTeb. Pour une adresse TEB donnée, l’ID de thread de moteur correspondant peut être trouvé à l’aide de GetThreadIdByTeb. Dans le débogage en mode noyau, l’TEB d’un thread (virtuel) est l’TEB du thread système qui s’exécutait sur le processeur correspondant lorsque le dernier événement s’est produit.
décalage de données
Dans le débogage en mode utilisateur, le décalage de données d’un thread (système) correspond à l’emplacement de l’TEB de ce thread. Dans le débogage en mode noyau, le décalage de données d’un thread (virtuel) est la structure KTHREAD du thread système qui s’exécutait sur le processeur correspondant lorsque le dernier événement s’est produit. Le décalage de données du thread actuel est disponible à l’aide de GetCurrentThreadDataOffset. Pour un décalage de données donné, l’ID de thread de moteur correspondant peut être trouvé à l’aide de GetThreadIdByDataOffset.
handle système
Le handle système du thread actuel est disponible à l’aide de GetCurrentThreadHandle. Pour un handle système donné, l’ID de thread de moteur correspondant peut être trouvé à l’aide de GetThreadIdByHandle. Dans le débogage en mode noyau, un handle artificiel est créé pour chaque processus (virtuel). Ce handle ne peut être utilisé qu’avec les requêtes d’API du moteur de débogueur.
L’ID de processus du moteur est utilisé par le moteur de 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 par rapport à la cible. L’index du premier processus de la cible est égal à zéro et l’index du dernier processus correspond au nombre de processus dans la cible moins un. Le nombre de processus dans la cible actuelle est disponible à l’aide de GetNumberProcesses.
L’ID de processus du moteur et l’ID de processus système d’un ou plusieurs threads de la cible actuelle sont disponibles à partir de leur index à l’aide de GetProcessIdsByIndex.
Le moteur conserve plusieurs informations 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 pour un processus.
ID de processus système (débogage en mode utilisateur uniquement)
L’ID de processus système du processus actuel 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 actuel 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 débogage en mode noyau, le PEB du processus (virtuel) est le PEB du processus système en cours d’exécution lorsque le dernier événement s’est produit.
décalage de données
Dans le débogage en mode utilisateur, le décalage de données d’un processus (système) est l’emplacement du PEB de ce processus. Dans le débogage en mode noyau, le décalage de données du processus (virtuel) est la structure KPROCESS du processus système qui s’exécutait lorsque le dernier événement s’est produit. Le décalage de données du processus actuel est disponible à 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 système
Le handle système du processus actuel 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. Dans le débogage en mode noyau, un handle artificiel est créé pour le processus (virtuel). Ce handle ne peut être utilisé qu’avec les requêtes du moteur de débogueur.
Dans le débogage en mode utilisateur actif, chaque fois qu’un thread est créé ou quitte une cible, les événements de débogage de thread de création et de thread de sortie 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 actif, chaque fois qu’un processus est créé ou quitte dans une cible, les événements de débogage de processus de création et de processus de sortie 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.
Pour plus d’informations sur les threads et les processus, notamment les structures TEB, KTHREAD, PEB et KPROCESS, consultez Microsoft Windows Internals by David Solomon et Mark Russinovich.