Événements de débogage
Un événement de débogage est un incident dans le processus en cours de débogage qui entraîne la notification du débogueur par le système. Les événements de débogage incluent la création d’un processus, la création d’un thread, le chargement d’une bibliothèque de liens dynamiques (DLL), le déchargement d’une DLL, l’envoi d’une chaîne de sortie et la génération d’une exception.
Si un événement de débogage se produit pendant qu’un débogueur attend un, le système remplit la structure DEBUG_EVENT spécifiée par WaitForDebugEvent avec des informations décrivant l’événement.
Lorsque le système avertit le débogueur d’un événement de débogage, il suspend également tous les threads du processus concerné. Les threads ne reprendnt pas l’exécution tant que le débogueur continue l’événement de débogage à l’aide de ContinueDebugEvent. Les événements de débogage suivants peuvent se produire pendant qu’un processus est débogué.
Événement de débogage | Description |
---|---|
CREATE_PROCESS_DEBUG_EVENT |
Généré chaque fois qu’un nouveau processus est créé dans un processus en cours de débogage ou chaque fois que le débogueur commence à déboguer un processus déjà actif. Le système génère cet événement de débogage avant que le processus commence à s’exécuter en mode utilisateur et avant que le système ne génère d’autres événements de débogage pour le nouveau processus. La structure DEBUG_EVENT contient une structure CREATE_PROCESS_DEBUG_INFO. Cette structure inclut un handle pour le nouveau processus, un handle dans le fichier image du processus, un handle du thread initial du processus et d’autres informations qui décrivent le nouveau processus. Le handle du processus a PROCESS_VM_READ et PROCESS_VM_WRITE accès. Si un débogueur dispose de ces types d’accès à un thread, il peut lire et écrire dans la mémoire du processus à l’aide des fonctions ReadProcessMemory et fonctions WriteProcessMemory. Si le système a précédemment signalé un événement EXIT_PROCESS_DEBUG_EVENT, le système ferme ce handle lorsque le débogueur appelle la fonction ContinueDebugEvent. Le handle du fichier image du processus a GENERIC_READ accès et est ouvert pour le partage en lecture. Le débogueur doit fermer ce handle lors du traitement CREATE_PROCESS_DEBUG_EVENT. Le handle du thread initial du processus a THREAD_GET_CONTEXT, THREAD_SET_CONTEXT et THREAD_SUSPEND_RESUME l’accès au thread. Si un débogueur dispose de ces types d’accès à un thread, il peut lire et écrire dans les registres du thread à l’aide des GetThreadContext et fonctions SetThreadContext et peut suspendre et reprendre le thread à l’aide des fonctions SuspendThread et ResumeThread. Si le système a précédemment signalé un événement EXIT_PROCESS_DEBUG_EVENT, le système ferme ce handle lorsque le débogueur appelle la fonction ContinueDebugEvent. |
CREATE_THREAD_DEBUG_EVENT |
Généré chaque fois qu’un nouveau thread est créé dans un processus en cours de débogage ou chaque fois que le débogueur commence à déboguer un processus déjà actif. Cet événement de débogage est généré avant que le nouveau thread commence à s’exécuter en mode utilisateur. La structure DEBUG_EVENT contient une structure CREATE_THREAD_DEBUG_INFO. Cette structure inclut un handle pour le nouveau thread et l’adresse de départ du thread. Le handle a THREAD_GET_CONTEXT, THREAD_SET_CONTEXT et THREAD_SUSPEND_RESUME accès au thread. Si un débogueur dispose de ces types d’accès à un thread, il peut lire et écrire dans les registres du thread à l’aide des GetThreadContext et fonctions SetThreadContext et peut suspendre et reprendre le thread à l’aide des fonctions SuspendThread et ResumeThread. Si le système a précédemment signalé un événement EXIT_THREAD_DEBUG_EVENT, le système ferme le handle au nouveau thread lorsque le débogueur appelle la fonction ContinueDebugEvent. |
EXCEPTION_DEBUG_EVENT |
Généré chaque fois qu’une exception se produit dans le processus en cours de débogage. Les exceptions possibles incluent la tentative d’accès à la mémoire inaccessible, l’exécution d’instructions de point d’arrêt, la tentative de division par zéro ou toute autre exception notée dans gestion des exceptions structurées. La structure DEBUG_EVENT contient une structure EXCEPTION_DEBUG_INFO. Cette structure décrit l’exception qui a provoqué l’événement de débogage. Outre les conditions d’exception standard, un code d’exception supplémentaire peut se produire pendant le débogage du processus de console. Le système génère un code d’exception DBG_CONTROL_C lorsque Ctrl+C est entrée dans un processus de console qui gère les signaux Ctrl+C et qui est débogué. Ce code d’exception n’est pas destiné à être géré par les applications. Une application ne doit jamais utiliser un gestionnaire d’exceptions pour le traiter. Il est déclenché uniquement pour l’avantage du débogueur et est utilisé uniquement lorsqu’un débogueur est attaché au processus de console. Si un processus n’est pas débogué ou si le débogueur transmet l’exception DBG_CONTROL_C non gérée (via la commande gn), la liste des fonctions de gestionnaire de l’application est recherchée, comme documenté pour la fonction SetConsoleCtrlHandler. Si le débogueur gère l’exception DBG_CONTROL_C (via la commande gh), une application ne remarque pas la ctrl+C, sauf dans le code comme celui-ci. while ((inputChar = getchar()) != EOF) ... Par conséquent, le débogueur ne peut pas être utilisé pour empêcher la fin de l’attente de lecture dans ce code. |
EXIT_PROCESS_DEBUG_EVENT |
Généré chaque fois que le dernier thread d’un processus en cours de débogage quitte. Cet événement de débogage se produit immédiatement après le déchargement du système des DLL du processus et met à jour le code de sortie du processus. La structure DEBUG_EVENT contient une structure EXIT_PROCESS_DEBUG_INFO qui spécifie le code de sortie. Le débogueur libère toutes les structures internes associées au processus lors de la réception de cet événement de débogage. Le système ferme le handle du débogueur au processus de sortie et à tous les threads du processus. Le débogueur ne doit pas fermer ces handles. La partie en mode noyau de l’arrêt du processus ne peut pas être terminée tant que le débogueur qui reçoit cet événement appelle ContinueDebugEvent. Jusqu’à ce moment- là, les handles de processus sont ouverts et l’espace d’adressage virtuel n’est pas libéré, de sorte que le débogueur peut examiner le processus enfant. Pour recevoir une notification lorsque la partie en mode noyau de l’arrêt du processus est terminée, dupliquez le handle retourné avec CREATE_PROCESS_DEBUG_EVENT, appelez ContinueDebugEvent, puis attendez que le handle de processus dupliqué soit signalé. |
EXIT_THREAD_DEBUG_EVENT |
Généré chaque fois qu’un thread faisant partie d’un processus en cours de débogage quitte. Le système génère cet événement de débogage immédiatement après avoir mis à jour le code de sortie du thread. La structure DEBUG_EVENT contient une structure EXIT_THREAD_DEBUG_INFO qui spécifie le code de sortie. Cet événement de débogage ne se produit pas si le thread de sortie est le dernier thread d’un processus. Dans ce cas, l’événement de débogage EXIT_PROCESS_DEBUG_EVENT se produit à la place. Le débogueur libère toutes les structures internes associées au thread lors de la réception de cet événement de débogage. Le système ferme le handle du débogueur au thread de sortie. Le débogueur ne doit pas fermer ce handle. |
LOAD_DLL_DEBUG_EVENT |
Généré chaque fois qu’un processus débogué charge une DLL. Cet événement de débogage se produit lorsque le chargeur système résout des liens vers une DLL ou lorsque le processus débogué utilise la fonction LoadLibrary. Cet événement de débogage se produit uniquement la première fois que le système attache une DLL à l’espace d’adressage virtuel d’un processus. La structure DEBUG_EVENT contient une structure LOAD_DLL_DEBUG_INFO. Cette structure inclut un handle vers la DLL nouvellement chargée, l’adresse de base de la DLL et d’autres informations qui décrivent la DLL. Le débogueur doit fermer le handle au handle DLL lors du traitement LOAD_DLL_DEBUG_EVENT. En règle générale, un débogueur charge une table de symboles associée à la DLL lors de la réception de cet événement de débogage. |
OUTPUT_DEBUG_STRING_EVENT |
Généré lorsqu’un processus en cours de débogage utilise le fonction OutputDebugString. La structure DEBUG_EVENT contient une structure OUTPUT_DEBUG_STRING_INFO. Cette structure spécifie l’adresse, la longueur et le format de la chaîne de débogage. |
UNLOAD_DLL_DEBUG_EVENT |
Généré chaque fois qu’un processus débogué décharge une DLL à l’aide de la fonction FreeLibrary. Cet événement de débogage se produit uniquement la dernière fois qu’une DLL est déchargée à partir de l’espace d’adressage d’un processus (autrement dit, lorsque le nombre d’utilisations de la DLL est égal à zéro). La structure DEBUG_EVENT contient une structure UNLOAD_DLL_DEBUG_INFO. Cette structure spécifie l’adresse de base de la DLL dans l’espace d’adressage du processus qui décharge la DLL. En règle générale, un débogueur décharge une table de symboles associée à la DLL lors de la réception de cet événement de débogage. Lorsqu’un processus se termine, le système décharge automatiquement les DLL du processus, mais ne génère pas d’événement de débogage UNLOAD_DLL_DEBUG_EVENT. |
RIP_EVENT |
Généré chaque fois qu’un processus en cours de débogage meurt en dehors du contrôle du débogueur système. La structure DEBUG_EVENT contient une structure RIP_INFO. Cette structure spécifie l’erreur et le type d’erreur. |