Contrôle des exceptions et des événements
Vous pouvez intercepter et gérer des exceptions dans les applications en mode utilisateur et en mode noyau à l’aide de différentes méthodes. Un débogueur actif, un débogueur post-mortem ou une routine de gestion des erreurs interne sont tous des moyens courants de gérer les exceptions.
Pour plus d’informations sur l’ordre de priorité de ces différents gestionnaires d’exceptions, consultez Activation du débogage post-mortem.
Lorsque le système d’exploitation Microsoft Windows autorise un débogueur à gérer une exception, l’application qui a généré l’exception s’interrompt dans le débogueur. Autrement dit, l’application s’arrête et le débogueur devient actif. Le débogueur peut ensuite gérer l’exception d’une manière ou d’une autre ou analyser la situation. Le débogueur peut ensuite mettre fin au processus ou le laisser reprendre l’exécution.
Si le débogueur ignore l’exception et laisse l’application continuer à s’exécuter, le système d’exploitation recherche d’autres gestionnaires d’exceptions comme si aucun débogueur n’était présent. Si l’exception est gérée, l’application continue de s’exécuter. Toutefois, si l’exception reste non prise en charge, le débogueur a ensuite une deuxième possibilité de gérer la situation.
Utilisation du débogueur pour analyser une exception
Lorsqu’une exception ou un événement entre dans le débogueur, vous pouvez utiliser le débogueur pour examiner le code en cours d’exécution et la mémoire utilisée par l’application. En modifiant certaines quantités ou en sautant à un autre point dans l’application, vous pouvez peut-être supprimer la cause de l’exception.
Vous pouvez reprendre l’exécution en émettant une commande gh (Go with Exception Handled) ou gn (Go with Exception Not Handled).
Si vous émettez la commande gn dans la deuxième possibilité du débogueur de gérer l’exception, l’application se termine.
Exceptions en mode noyau
Les exceptions qui se produisent dans le code en mode noyau sont plus graves que les exceptions en mode utilisateur. Si les exceptions en mode noyau ne sont pas gérées, un bogue case activée est émis et le système s’arrête.
Comme pour les exceptions en mode utilisateur, si un débogueur en mode noyau est attaché au système, le débogueur est averti avant que le bogue case activée écran (également appelé écran bleu) s’affiche. Si aucun débogueur n’est attaché, l’écran du bogue case activée s’affiche. Dans ce cas, le système d’exploitation peut créer un fichier de vidage sur incident.
Contrôle des exceptions et des événements à partir du débogueur
Vous pouvez configurer le débogueur pour qu’il réagisse aux exceptions et événements spécifiés d’une manière spécifique.
Le débogueur peut définir le status d’arrêt pour chaque exception ou événement :
L’événement peut provoquer un arrêt dans le débogueur dès qu’il se produit (la « première chance »).
L’événement peut s’interrompre une fois que d’autres gestionnaires d’erreurs ont eu la possibilité de répondre (la « deuxième chance »).
L’événement peut également envoyer un message au débogueur, mais continuer à s’exécuter.
Le débogueur peut ignorer l’événement.
Le débogueur peut également définir la status de gestion pour chaque exception et événement. Le débogueur peut traiter l’événement comme une exception gérée ou une exception non prise en charge. (Bien sûr, les événements qui ne sont pas réellement des erreurs ne nécessitent aucune gestion.)
Vous pouvez contrôler la status d’arrêt et la gestion des status en effectuant l’une des opérations suivantes :
Utilisez la commande SXE, SXD, SXN ou SXI dans la fenêtre Commande du débogueur.
(CDB et NTSD) Utilisez l’option -x, -xe, -xd, -xn ou -xi sur la ligne de commande.
(CDB, NTSD et KD) Utilisez le mot clé sxe ou sxd dans le fichier Tools.ini.
(WinDbg uniquement) Sélectionnez Filtres d’événements dans le menu Déboguer pour ouvrir la boîte de dialogue Filtres d’événements, puis choisissez les options souhaitées.
La commande SX\*, l’option de ligne de commande -x\* et la Tools.ini mot clé sx\* définissent généralement le status d’arrêt de l’événement spécifié. Vous pouvez ajouter l’option -h pour que la gestion des status soit définie à la place.
Il existe quatre codes d’événements spéciaux (cc, hc, bpec et ssec) qui spécifient toujours la gestion des status au lieu d’interrompre status.
Vous pouvez afficher l’exception ou l’événement le plus récent à l’aide de la commande .lastevent (Afficher le dernier événement).
Contrôle de l’état d’arrêt
Lorsque vous définissez le status d’arrêt d’une exception ou d’un événement, vous pouvez utiliser les options suivantes.
Commande | Nom d’état | Description |
---|---|---|
SXE ou -xe | Break (Activé) |
Lorsque cette exception se produit, la cible s’interrompt immédiatement dans le débogueur. Cette interruption se produit avant que d’autres gestionnaires d’erreurs ne soient activés. Cette méthode est appelée gestion de la première chance. |
SXD ou -xd | Pause de la deuxième chance (Désactivé) |
Le débogueur ne s’interrompt pas pour ce type d’exception de première chance (bien qu’un message s’affiche). Si d’autres gestionnaires d’erreurs ne peuvent pas traiter cette exception, l’exécution s’arrête et la cible s’arrête dans le débogueur. Cette méthode est appelée gestion de la deuxième chance. |
SXN ou -xn | Sortie (Notifier) |
Lorsque cette exception se produit, l’application cible n’entre pas du tout dans le débogueur. Toutefois, un message s’affiche pour informer l’utilisateur de cette exception. |
SXI ou -xi | Ignorer |
Lorsque cette exception se produit, l’application cible n’entre pas dans le débogueur et aucun message n’est affiché. |
Si une exception n’est pas prévue par un paramètre SX*, l’application cible entre dans le débogueur à la deuxième chance. La status par défaut pour les événements est répertoriée dans la section « Définitions d’événements et valeurs par défaut » de cette rubrique.
Pour définir l’arrêt status à l’aide de l’interface graphique WinDbg, filtres d’événements dans le menu Déboguer sélectionnez l’événement souhaité dans la liste dans la boîte de dialogue Filtres d’événements, puis sélectionnez Activé, Désactivé, Sortie ou Ignorer.
Contrôle de l’état de gestion
Tous les événements sont considérés comme non gérés, sauf si vous utilisez la commande gh (Go with Exception Handled).
Toutes les exceptions sont considérées comme non gérées, sauf si vous utilisez la commande sx\* avec l’option -h .
En outre, les options SX* peuvent configurer les status de gestion pour les handles non valides, les instructions d’arrêt STATUS_BREAKPOINT et les exceptions à étape unique. (Cette configuration est distincte de leur configuration d’arrêt.) Lorsque vous configurez leur status d’arrêt, ces événements sont nommés respectivement ch, bpe et sse. Lorsque vous configurez leur gestion status, ces événements sont respectivement nommés hc, bpec et ssec. (Pour obtenir la liste complète des événements, consultez la section « Définitions et valeurs par défaut des événements » suivante.)
Vous pouvez configurer le status de gestion de l’événement CTRL+C (cc), mais pas son status d’arrêt. Si une application reçoit un événement CTRL+C, l’application s’interrompt toujours dans le débogueur.
Lorsque vous utilisez la commande SX* sur les événements cc, hc, bpec et ssec , ou lorsque vous utilisez la commande SX* avec l’option -h sur une exception, les actions suivantes se produisent.
Commande | Nom d’état | Description |
---|---|---|
SXE |
Traitées |
L’événement est considéré comme géré lorsque l’exécution reprend. |
SXD,SXN,SXI |
Non géré |
L’événement est considéré comme non géré lorsque l’exécution reprend. |
Pour définir la gestion des status à l’aide de l’interface graphique WinDbg, sélectionnez Filtres d’événements dans le menu Débogage, sélectionnez l’événement souhaité dans la liste dans la boîte de dialogue Filtres d’événements, puis sélectionnez Géré ou Non géré.
Commandes automatiques
Le débogueur vous permet également de définir des commandes qui sont exécutées automatiquement si l’événement ou l’exception provoque une interruption dans le débogueur. Vous pouvez définir une chaîne de commande pour l’arrêt de la première chance et une chaîne de commande pour l’arrêt de la deuxième chance. Vous pouvez définir ces chaînes avec la commande SX\* ou déboguer | Commande Filtres d’événements . Chaque chaîne de commande peut contenir plusieurs commandes séparées par des points-virgules.
Ces commandes sont exécutées quel que soit le status d’arrêt. Autrement dit, si le status d’arrêt est « Ignorer », la commande est toujours exécutée. Si le status d’arrêt est « Arrêt de la deuxième chance », la commande de première chance est exécutée lorsque l’exception se produit pour la première fois, avant que d’autres gestionnaires d’exceptions ne soient impliqués. La chaîne de commande peut se terminer par une commande d’exécution telle que g (Go),gh (Go avec gestion des exceptions) ou gn (Go avec exception non gérée).
Définitions d’événements et valeurs par défaut
Vous pouvez modifier le status d’arrêt ou gérer status des exceptions suivantes. Leur status d’arrêt par défaut est indiqué.
Les status de gestion par défaut des exceptions suivantes sont toujours « Non gérés ». Veillez à modifier cette status. Si vous remplacez cette status par « Géré », toutes les exceptions de première chance et de deuxième chance de ce type sont considérées comme gérées, et cette configuration contourne toutes les routines de gestion des exceptions.
Code d’événement | Signification | Status d’arrêt par défaut |
---|---|---|
asrt |
Échec d’assertion |
Arrêter |
av |
Violation d’accès |
Arrêter |
Dm |
Données mal alignées |
Arrêter |
Dz |
Division entière par zéro |
Arrêter |
c000008e |
Division à virgule flottante par zéro |
Arrêter |
eh |
Exception EH C++ |
Pause de la deuxième chance |
Gp |
Violation de page de protection |
Arrêter |
Ii |
Instruction non conforme |
Pause de la deuxième chance |
Iov |
Dépassement de capacité d’entier |
Arrêter |
Ip |
Erreur d’E/S dans la page |
Arrêter |
Isc |
Appel système non valide |
Arrêter |
Lsq |
Séquence de verrous non valide |
Arrêter |
sbo |
Dépassement de mémoire tampon au niveau de la pile |
Arrêter |
Sov |
Dépassement de capacité de la pile |
Arrêter |
wkd |
Débogueur de veille |
Arrêter |
Aph |
Blocage de l’application Cette exception est déclenchée si le système d’exploitation Windows conclut qu’un processus a cessé de répondre (autrement dit, est suspendu). |
Arrêter |
3c |
Arrêt de l’application enfant |
Pause de la deuxième chance |
chhc |
Handle non valide |
Arrêter |
Nombre |
Toute exception numérotée |
Pause de la deuxième chance |
Note Vous pouvez remplacer le status d’arrêt asrt pour une adresse spécifique à l’aide de la commande ah (Gestion des assertions). Les codes d’événements ch et hc font référence à la même exception. Lorsque vous contrôlez son status d’arrêt, utilisez sx* ch. Lorsque vous contrôlez sa gestion status, utilisez sx* hc.
Vous pouvez modifier le status d’arrêt ou gérer status des exceptions suivantes. Leur status d’arrêt par défaut est indiqué.
La status de gestion par défaut des exceptions suivantes est toujours « Gérée ». Étant donné que ces exceptions sont utilisées pour communiquer avec le débogueur, vous ne devez généralement pas remplacer leur status par « Non géré ». Cette status entraîne l’interception des exceptions par d’autres gestionnaires d’exceptions si le débogueur les ignore.
Une application peut utiliser DBG_COMMAND_EXCEPTION (dbce) pour communiquer avec le débogueur. Cette exception est similaire à un point d’arrêt, mais vous pouvez utiliser la commande SX* pour réagir d’une manière spécifique lorsque cette exception se produit.
Code d’événement | Signification | Status d’arrêt par défaut |
---|---|---|
dbce |
Exception de commande de débogueur spécial |
Ignorer |
vcpp |
Exception Visual C++ spéciale |
Ignorer |
Wos |
Exception à étape unique WOW64 |
Arrêter |
wob |
Exception de point d’arrêt WOW64 - |
Arrêter |
Sse |
Exception à étape unique |
Arrêter |
Bpe |
Exception de point d’arrêt |
Arrêter |
cce |
CTRL+C ou CTRL+ARRÊT Cette exception est déclenchée si la cible est une application console et que CTRL+C ou CTRL+BREAK lui est passé. |
Arrêter |
Note Les trois dernières exceptions du tableau précédent ont deux codes d’événement différents. Lorsque vous contrôlez leur status d’arrêt, utilisez sse, bpe et cce. Lorsque vous contrôlez leur gestion status, utilisez ssec, bpec et cc.
Les exceptions suivantes sont utiles lorsque vous déboguez du code managé.
Code de l’événement | Signification | Status par défaut |
---|---|---|
Clr |
Exception du Common Language Runtime |
Pause de la deuxième chance Non géré |
clrn |
Exception de notification du Common Language Runtime |
Pause de la deuxième chance Gérée |
Vous pouvez modifier la status d’arrêt des événements suivants. Étant donné que ces événements ne sont pas des exceptions, leur gestion status n’est pas pertinente.
Code de l’événement | Signification | Status d’arrêt par défaut |
---|---|---|
Ser |
Erreur système |
Ignorer |
cpr[ :Process] |
Création de processus La définition de la status d’arrêt de cet événement s’applique uniquement au débogage en mode utilisateur. Cet événement ne se produit pas en mode noyau. Vous pouvez contrôler cet événement uniquement si vous avez activé le débogage des processus enfants dans CDB ou WinDbg, par le biais del’option de ligne de commande -o ou de la commande .childdbg (Debug Child Processes). Le nom du processus peut inclure une extension de nom de fichier facultative et un astérisque () ou un point d’interrogation ( ?) en tant que caractères génériques. Le débogueur mémorise uniquement le paramètre cpr le plus récent. Les paramètres distincts pour les processus distincts ne sont pas pris en charge. Incluez un signe deux-points ou un espace entre cpr et Process. Si Process est omis, le paramètre s’applique à toute création de processus enfant. |
Ignorer |
epr[ :Process] |
Sortie du processus La définition de la status d’arrêt de cet événement s’applique uniquement au débogage en mode utilisateur. Cet événement ne se produit pas en mode noyau. Vous pouvez contrôler cet événement uniquement si vous avez activé le débogage des processus enfants dans CDB ou WinDbg, par le biais del’option de ligne de commande -o ou de la commande .childdbg (Debug Child Processes). Le nom du processus peut inclure une extension de nom de fichier facultative et un astérisque () ou un point d’interrogation ( ?) en tant que caractères génériques. Le débogueur ne mémorise que le paramètre epr le plus récent. Les paramètres distincts pour les processus distincts ne sont pas pris en charge. Incluez un signe deux-points ou un espace entre epr et Process. Si Process est omis, le paramètre s’applique à toute sortie de processus enfant. |
Ignorer |
ct |
Création de threads |
Ignorer |
et |
Sortie de thread |
Ignorer |
ld[ :Module] |
Module de chargement Si vous spécifiez Module, l’arrêt se produit lorsque le module portant ce nom est chargé. Le module peut spécifier le nom ou l’adresse du module. Si le nom est utilisé, Module peut contenir divers caractères génériques et spécificateurs. (Pour plus d’informations sur la syntaxe, consultez Syntaxe de caractères génériques de chaîne.) Le débogueur ne mémorise que le paramètreld le plus récent. Les paramètres distincts pour les modules distincts ne sont pas pris en charge. Incluez un signe deux-points ou un espace entre ld et Module. Si Module est omis, l’événement est déclenché lors du chargement d’un module. |
Sortie |
ud[ :Module] |
Décharger le module Si vous spécifiez Module, l’arrêt se produit lorsque le module portant ce nom, ou à cette adresse de base, est déchargé. Le module peut spécifier le nom ou l’adresse du module. Si le nom est utilisé, Module peut être un nom exact ou inclure des caractères génériques. Si Module est un nom exact, il est immédiatement résolu en adresse de base à l’aide de la liste des modules du débogueur actuel et il est stocké en tant qu’adresse. Si Module contient des caractères génériques, la chaîne de modèle est conservée pour une correspondance ultérieure lorsque des événements de déchargement se produisent. Rarement, le débogueur n’a pas d’informations de nom pour les événements de déchargement et correspond uniquement à l’adresse de base. Par conséquent, si Module contient des caractères génériques, le débogueur ne peut pas effectuer une correspondance de nom dans ce cas de déchargement particulier et s’interrompt lorsqu’un module est déchargé. Le débogueur ne mémorise que le paramètre ud le plus récent. Les paramètres distincts pour les modules distincts ne sont pas pris en charge. Incluez un signe deux-points ou un espace entre ud et Module. Si Module est omis, l’événement est déclenché lors du chargement d’un module. |
Sortie |
out[ :Output] |
Sortie de l’application cible Si vous spécifiez Output, l’arrêt se produit uniquement lorsque la sortie qui correspond au modèle spécifié est reçue. La sortie peut contenir divers caractères génériques et spécificateurs. (Pour plus d’informations sur la syntaxe, consultez Syntaxe de caractères génériques de chaîne.) Toutefois, La sortie ne peut pas contenir de deux-points ou d’espaces. Cette correspondance ne respecte pas la casse. Incluez un signe deux-points ou un espace entre sortie et Sortie. |
Ignorer |
ibp |
Point d’arrêt initial (Cet événement se produit au début de la session de débogage et après le redémarrage de l’ordinateur cible.) |
En mode utilisateur : Pause. Vous pouvez remplacer cette status par « Ignorer » à l’aide de l’option de ligne de commande-g. En mode noyau : Ignorer. Vous pouvez remplacer cette status par « Activé » par diverses méthodes. Pour plus d’informations sur la façon de modifier cette status, consultez Blocage et redémarrage de l’ordinateur cible. |
Iml |
Chargement initial du module (Mode noyau uniquement) |
à ignorer. Vous pouvez remplacer cette status par « Break » par diverses méthodes. Pour plus d’informations sur la façon de modifier cette status, consultez Blocage et redémarrage de l’ordinateur cible. |