Partager via


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
ssec

Exception à étape unique

Arrêter

Bpe
bpec

Exception de point d’arrêt

Arrêter

cce
Cc

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.