Contrôle d'un programme pendant le débogage
Pendant le débogage, le contrôle d'un programme consiste à définir des points d'arrêt dans le code managé, à exécuter pas à pas le code managé et le code non managé et à gérer les exceptions de première chance et de seconde chance. Les sections suivantes décrivent comment un débogueur utilise l'API de débogage du Common Language Runtime (CLR) pour effectuer ces tâches.
Définition d'un point d'arrêt dans le code managé
La procédure suivie pour définir un point d'arrêt dans le code managé est décrite ci-dessous :
Le débogueur obtient un objet de module pour la fonction donnée. Le débogueur appelle la méthode ICorDebugAppDomain::GetModuleFromMetaDataInterface avec l'interface de métadonnées pour obtenir un objet ICorDebugModule pour le module de la fonction.
Le débogueur obtient un objet de fonction pour la fonction donnée en appelant la méthode ICorDebugModule::GetFunctionFromToken.
Le débogueur obtient l'objet de code pour la fonction donnée en appelant la méthode ICorDebugFunction::GetILCode.
Le débogueur crée un point d'arrêt dans le code managé en appelant la méthode ICorDebugCode::CreateBreakpoint avec un offset spécifique. CreateBreakpoint retourne une instance d'ICorDebugBreakpoint. L'état du point d'arrêt est actif pendant sa création.
Le débogueur poursuit l'exécution du processus en appelant la méthode ICorDebugController::Continue pour le processus du programme débogué en cours.
Lorsqu'un thread atteint le point d'arrêt, l'API de débogage notifie le débogueur en appelant le rappel ICorDebugManagedCallback::Breakpoint.
Exécution pas à pas du code managé et du code non managé
La procédure suivie par un débogueur pour exécuter pas à pas le code managé est décrite ci-dessous.
Le débogueur crée une exécution pas à pas en fonction du thread dans lequel l'exécution pas à pas doit se produire. Le débogueur appelle la méthode ICorDebugThread::CreateStepper pour le thread faisant l'objet de l'exécution pas à pas. Le débogueur peut également appeler la méthode ICorDebugFrame::CreateStepper pour la trame pour laquelle l'exécution pas à pas doit se produire. Le processus est supposé être arrêté lors de la création de l'exécution pas à pas.
Le débogueur exécute pas à pas le thread en appelant la méthode ICorDebugStepper::Step.
Le débogueur poursuit l'exécution du processus en appelant la méthode ICorDebugController::Continue pour le processus du programme débogué en cours.
L'API de débogage informe le débogueur que l'étape est terminée. L'API de débogage appelle la méthode ICorDebugManagedCallback::StepComplete pour l'objet que le débogueur avait enregistré avec le runtime.
Le débogueur réexécute pas à pas le thread en appelant la méthode ICorDebugStepper::Step.
Le débogueur poursuit l'exécution du processus en appelant la méthode ICorDebugController::Continue pour le processus du programme débogué en cours.
D'autres possibilités d'exécution pas à pas dans le code non managé sont décrites ci-dessous :
Le débogueur peut ignorer l'exécution pas à pas dans le code natif. Le débogueur appelle la méthode ICorDebugStepper::StepOut pour ignorer le code natif faisant l'objet d'une exécution pas à pas jusqu'à ce que la trame précédente soit réactivée. L'API de débogage appelle la méthode ICorDebugManagedCallback::StepComplete lorsque le code managé est entré à nouveau.
Le débogueur peut procéder à une exécution pas à pas dans la section suivante du code managé. Le débogueur appelle la méthode ICorDebugStepper::Step de manière à retourner le contrôle au débogueur lorsque la trame de code managé précédente est réentrée ou lorsque le code non managé appelle le nouveau code managé.
Le débogueur poursuit l'exécution du processus en appelant la méthode ICorDebugController::Continue pour le processus du programme débogué en cours.
L'API de débogage informe le débogueur de son exécution pas à pas dans le code non managé en appelant la méthode ICorDebugUnmanagedCallback::DebugEvent.
Gestion des exceptions
La procédure suivie pour gérer des exceptions de première chance et de seconde chance est décrite ci-dessous :
Le CLR informe le débogueur qu'une exception de première chance s'est produite. L'API de débogage appelle la méthode ICorDebugManagedCallback::Exception sur l'interface ICorDebugManagedCallback que le débogueur a enregistrée avec le runtime.
Le débogueur obtient des informations sur l'exception. Le débogueur appelle la méthode ICorDebugThread::GetCurrentException sur l'objet ICorDebugThread qui a été passé dans le rappel pour obtenir un objet d'exception (ICorDebugValue).
Le débogueur obtient l'objet ICorDebugObjectValue pour l'exception. Le débogueur appelle la méthode QueryInterface pour obtenir l'objet ICorDebugObjectValue pour l'exception.
Le débogueur obtient la classe de l'objet d'exception qui a été levé en appelant la méthode ICorDebugObjectValue::GetClass.
Le débogueur décide d'ignorer l'exception et de continuer.
Le CLR informe le débogueur qu'une exception de seconde chance s'est produite. L'API de débogage appelle la méthode ICorDebugManagedCallback::Exception et spécifie que l'exception est une exception de seconde chance.
L'utilisateur décide que l'exception est sans importance. Le débogueur appelle la méthode ICorDebugThread::ClearCurrentException pour le thread du programme débogué en cours. Cette méthode efface l'exception pour l'empêcher d'être levée.
Le débogueur poursuit l'exécution du processus en appelant la méthode ICorDebugController::Continue pour le processus du programme débogué en cours.
Voir aussi
Concepts
Vue d'ensemble du débogage CLR