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 par diverses méthodes. Un débogueur actif, un débogueur postmortem 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 précédence de ces différents gestionnaires d’exceptions, consultez Activation du débogage post-mortem.

Lorsque le système d’exploitation Microsoft Windows permet à un débogueur de gérer une exception, l’application qui a généré l’exception se décompose 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 certaine manière ou analyser la situation. Le débogueur peut ensuite mettre fin au processus ou le laisser recommencer.

Si le débogueur ignore l’exception et permet à l’application de 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 à s’exécuter. Toutefois, si l’exception n'est pas gérée, le débogueur se voit alors offrir une deuxième occasion de traiter la situation.

Utilisation du débogueur pour analyser une exception

Lorsqu’une exception ou un événement intervient 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 opportunité 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, une vérification des bogues est émise 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 l’affichage de l’écran de vérification des bogues (également appelé écran bleu). Si aucun débogueur n’est attaché, l’écran de vérification des bogues s’affiche. Dans ce cas, le système d’exploitation peut créer un fichier de vidage sur incident.

Gestion des exceptions et des événements à partir du débogueur

Vous pouvez configurer le débogueur pour réagir aux exceptions et événements spécifiés de manière spécifique.

Le débogueur peut définir l’état d’arrêt pour chaque exception ou événement :

  • L’événement peut provoquer une interruption dans le débogueur dès qu’il se produit (la « première chance »).

  • L’événement peut intervenir après que d’autres gestionnaires d’erreurs ont eu l’occasion de répondre (la « deuxième chance »).

  • L’événement peut envoyer un message au débogueur tout en continuant à s'exécuter.

  • Le débogueur peut ignorer l’événement.

Le débogueur peut également définir l’état de gestion de chaque exception et événement. Le débogueur peut traiter l’événement comme une exception gérée ou une exception non gérée. (Bien sûr, les événements qui ne sont pas réellement des erreurs ne nécessitent aucune gestion.)

Vous pouvez contrôler l’état d'interruption et l’état de traitement 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ébogage 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 le mot clé sx\* Tools.ini définissent généralement l’état d’arrêt de l’événement spécifié. Vous pouvez ajouter l’option -h pour que l’état de gestion soit défini à la place.

Il existe quatre codes d’événement spéciaux (cc, hc, bpec et ssec) qui spécifient toujours l’état de gestion au lieu d’un état d’arrêt.

Vous pouvez afficher l’exception ou l’événement le plus récent à l’aide de la commande .lastevent (Display Last Event).

Contrôle de l’état de pause

Lorsque vous définissez l’état d’arrêt d’une exception ou d’un événement, vous pouvez utiliser les options suivantes.

Command Nom de l’état Descriptif

SXE ou -xe

Break

(Activé)

Lorsque cette exception se produit, la cible se décompose 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 première chance.

SXD ou -xd

Deuxième saut de chance

(Désactivé)

Le débogueur ne s’arrête 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 passe en mode débogueur. Cette méthode est appelée gestion de seconde chance.

SXN ou -xn

Output

(Notifier)

Lorsque cette exception se produit, l’application cible ne se décompose pas du tout dans le débogueur. Toutefois, un message s’affiche qui informe l’utilisateur de cette exception.

SXI ou -xi

Ignorer

Lorsque cette exception se produit, l’application cible ne se décompose pas dans le débogueur et aucun message n’est affiché.

Si une exception n’est pas anticipée par un paramètre SX*, l’application cible entre dans le débogueur lors de la deuxième tentative. L’état par défaut des événements est répertorié dans la section « Définitions d’événements et valeurs par défaut » de cette rubrique.

Pour définir l’état d’arrêt à l’aide de l’interface graphique WinDbg, les filtres d’événements dans le menu Débogage sélectionnent l’événement souhaité dans la liste de 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 l’état de gestion des handles non valides, des instructions d’arrêt STATUS_BREAKPOINT et des exceptions à étape unique. (Cette configuration est distincte de sa configuration d’arrêt.) Lorsque vous configurez leur état d’arrêt, ces événements sont nommés ch, bpe et sse, respectivement. Lorsque vous configurez leur état de gestion, ces événements sont nommés hc, bpec et ssec, respectivement. (Pour obtenir la liste complète des événements, consultez la section « Définitions d’événements et valeurs par défaut ».

Vous pouvez configurer l’état de gestion de l’événement Ctrl+C (cc), mais pas son état 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.

Command Nom de l’état Descriptif

SXE

Traitées

L’événement est considéré comme géré lorsque l'exécution reprend.

SXD,SXN,SXI

Non géré

On considère que l'événement n'est pas traité lorsque l'exécution reprend.

Pour définir l’état de gestion à 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 Handled ou Not Handled.

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 un saut dans le débogueur. Vous pouvez définir une chaîne de commande pour le premier saut de chance et une chaîne de commande pour le deuxième saut de chance. Vous pouvez définir ces chaînes avec la commande SX\* ou le débogage | 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 indépendamment du statut d'interruption. Autrement dit, si l’état d’arrêt est « Ignorer », la commande est toujours exécutée. Si l’état d’arrêt est « Arrêt de 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 exception gérée) ou gn (Go avec exception non gérée).

Définitions d’événements et valeurs par défaut

Vous pouvez modifier l'état d'interruption ou l'état de traitement des exceptions suivantes. Leur état d’arrêt par défaut est indiqué.

L’état de gestion par défaut des exceptions suivantes est toujours « Non géré ». Faites attention en modifiant ce statut. Si vous remplacez ce statut 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 Meaning État d’arrêt par défaut

asrt

Échec de l’assertion

Casser

av

Violation d’accès

Casser

dm

Données mal alignées

Casser

Dz

Division entière par zéro

Casser

c000008e

Division à virgule flottante par zéro

Casser

hein

Gestion des exceptions C++

Pause de seconde chance

Gp

Violation de page Guard

Casser

ii

Instruction illégale

Saut de deuxième chance

iov

Débordement d'entier

Casser

Ip

Erreur d’E/S dans la page

Casser

Isc

Appel système non valide

Casser

lsq

Séquence de verrous non valide

Casser

sbo

Dépassement de mémoire tampon de pile

Casser

Sov

Dépassement de capacité de pile

Casser

wkd

Débogueur de réveil

Casser

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 (c’est-à-dire suspendu).

Casser

3c

Arrêt de l’application enfant

Saut de deuxième chance

ch
HC

Handle non valide

Casser

Nombre

Toute exception numérotée

Saut de deuxième chance

Note Vous pouvez remplacer l’état d’arrêt asrt pour une adresse spécifique à l’aide de la commande ah (Gestion des assertions). Les codes d’événement ch et hc font référence à la même exception. Lorsque vous contrôlez son état d’arrêt, utilisez sx* ch. Lorsque vous contrôlez son état de gestion, utilisez sx* hc.

Vous pouvez modifier l'état d'interruption ou l'état de traitement des exceptions suivantes. Leur état d’arrêt par défaut est indiqué.

L’état de gestion par défaut des exceptions suivantes est toujours « Handled ». Étant donné que ces exceptions sont utilisées pour communiquer avec le débogueur, vous ne devez généralement pas remplacer leur état par « Non géré ». Lorsque le débogueur ignore les exceptions, ce statut entraîne l’interception des exceptions par d’autres gestionnaires d’exceptions.

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 de manière spécifique lorsque cette exception se produit.

Code d’événement Meaning État d’arrêt par défaut

dbce

Exception de commande de débogueur spécifique

Ignorer

vcpp

Exception spéciale Visual C++

Ignorer

Wos

Exception WOW64 en une seule étape

Casser

wob

Exception de point d’arrêt de WOW64

Casser

Sse
ssec

Exception en une seule étape

Casser

bpe
bpec

Exception de point d’arrêt

Casser

cce
cc

Ctrl+C ou Ctrl+Arrêt

Cette exception est déclenchée si la cible est une application console et ctrl+C ou Ctrl+BREAK est transmise à cette application.

Casser

Note Les trois dernières exceptions du tableau précédent ont deux codes d’événement différents. Lorsque vous contrôlez leur état d’arrêt, utilisez sse, bpe et cce. Lorsque vous contrôlez leur état de gestion, utilisez ssec, bpec et cc.

Les exceptions suivantes sont utiles lorsque vous déboguez du code managé.

Code d’événement Meaning État par défaut

Clr

Exception du Common Language Runtime

Saut de deuxième chance

Non traité

clrn

Exception de notification du Common Language Runtime

Pause de deuxième chance

Gérée

Vous pouvez modifier le statut de pause des événements suivants. Étant donné que ces événements ne sont pas des exceptions, leur état de gestion n’est pas pertinent.

Code d’événement Meaning État d’arrêt par défaut

Ser

Erreur système

Ignorer

rpc[ :Process]

Création de processus

La définition de l’état 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, vial’option de ligne de commande -o ou via la commande .childdbg (Processus enfants de débogage).

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 se souvient que du paramètre rcr 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 le processus est omis, le paramètre s’applique à toute création de processus enfant.

Ignorer

epr[ :Process]

Sortie du processus

La définition de l’état 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, vial’option de ligne de commande -o ou via la commande .childdbg (Processus enfants de débogage).

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 se souvient uniquement du 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 le processus est omis, le paramètre s’applique à toute sortie de processus enfant.

Ignorer

Ct

Création de threads

Ignorer

et

Sortie du 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 générique de chaîne.)

Le débogueur se souvient uniquement du paramètre ld le plus récent. Les paramètres distincts des modules distincts ne sont pas pris en charge. Incluez un signe deux-points ou un espace entre ld et Module.

Si le module est omis, l’événement est déclenché lorsqu’un module est chargé.

Output

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 une adresse de base à l’aide de la liste de modules du débogueur actuel et est stocké en tant qu’adresse. Si le module contient des caractères génériques, la chaîne de modèle est conservée pour la 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 associe uniquement par l'adresse de base. Par conséquent, si le 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’arrête lorsqu’un module est déchargé.

Le débogueur se souvient uniquement du paramètre ud le plus récent. Les paramètres distincts des modules distincts ne sont pas pris en charge. Incluez un signe deux-points ou un espace entre ud et Module.

Si le module est omis, l’événement est déclenché lorsqu’un module est chargé.

Output

out[ :Output]

Sortie de l’application cible

Si vous spécifiez Sortie, l’arrêt se produit uniquement lorsque la sortie correspondant 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 générique de chaîne.) Toutefois, la sortie ne peut pas contenir de deux-points ou d’espaces. La correspondance n’est pas sensible à la casse. Ajoutez un deux-points ou un espace entre départ 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 avoir redémarré l’ordinateur cible.)

En mode utilisateur : Interrompre. Vous pouvez remplacer ce statut par « Ignorer » à l’aide de l’option de ligne de commande-g.

En mode noyau : Ignorer. Vous pouvez remplacer ce statut par « Activé » par diverses méthodes. Pour plus d’informations sur la modification de cet état, consultez Blocage et redémarrage de l’ordinateur cible.

iml

Chargement initial du module

Mode noyau uniquement

Ignorer. Vous pouvez remplacer ce statut par « Break » par diverses méthodes. Pour plus d’informations sur la modification de cet état, consultez Blocage et redémarrage de l’ordinateur cible.