Lier des points d’arrêt

Si l’utilisateur définit un point d’arrêt, peut-être en appuyant sur F9, l’IDE formule la requête et invite la session de débogage à créer le point d’arrêt.

Définir un point d'arrêt

La définition d’un point d’arrêt est un processus en deux étapes, car le code ou les données affectés par le point d’arrêt peuvent ne pas encore être disponibles. Tout d’abord, le point d’arrêt doit être décrit, puis, à mesure que le code ou les données deviennent disponibles, il doit être lié à ce code ou ces données, comme suit :

  1. Le point d’arrêt est demandé à partir des moteurs de débogage (DEs) appropriés, puis le point d’arrêt est lié au code ou aux données au fur et à mesure qu’il devient disponible.

  2. La demande de point d’arrêt est envoyée à la session de débogage, qui l’envoie à toutes les DE pertinentes. Tout DE qui choisit de gérer le point d’arrêt crée un point d’arrêt en attente correspondant.

  3. La session de débogage collecte les points d’arrêt en attente et les renvoie au package de débogage (composant de débogage de Visual Studio).

  4. Le package de débogage invite la session de débogage à lier le point d’arrêt en attente au code ou aux données. La session de débogage envoie cette requête à toutes les DE pertinentes.

  5. Si le DE est en mesure de lier le point d’arrêt, il envoie un événement lié au point d’arrêt à la session de débogage. Si ce n’est pas le cas, il envoie un événement d’erreur de point d’arrêt à la place.

Points d’arrêt en attente

Un point d’arrêt en attente peut être lié à plusieurs emplacements de code. Par exemple, une ligne de code source pour un modèle C++ peut être liée à chaque séquence de code générée à partir du modèle. La session de débogage peut utiliser un événement lié au point d’arrêt pour énumérer les contextes de code liés à un point d’arrêt au moment de l’envoi de l’événement. D’autres contextes de code peuvent être liés ultérieurement, de sorte que le DE peut envoyer plusieurs événements liés au point d’arrêt pour chaque demande de liaison. Toutefois, un DE ne doit envoyer qu’un seul événement d’erreur de point d’arrêt par demande de liaison.

Implémentation

Par programmation, le package de débogage appelle le gestionnaire de débogage de session (SDM) et lui donne une interface IDebugBreakpointRequest2 qui encapsule une structure BP_REQUEST_INFO , qui décrit le point d’arrêt à définir. Bien que les points d’arrêt puissent être de nombreux formulaires, ils se résolvent finalement en un code ou un contexte de données.

Le SDM transmet cet appel à chaque DE pertinent en appelant sa méthode CreatePendingBreakpoint . Si le DE choisit de gérer le point d’arrêt, il crée et retourne une interface IDebugPendingBreakpoint2 . Le SDM collecte ces interfaces et les transmet au package de débogage en tant qu’interface unique IDebugPendingBreakpoint2 .

Jusqu’à présent, aucun événement n’a été généré.

Le package de débogage tente ensuite de lier le point d’arrêt en attente au code ou aux données en appelant Bind, qui est implémenté par le DE.

Si le point d’arrêt est lié, le DE envoie une interface d’événement IDebugBreakpointBoundEvent2 au package de débogage. Le package de débogage utilise cette interface pour énumérer tous les contextes de code (ou le contexte de données unique) liés au point d’arrêt en appelant EnumBoundBreakpoints, qui retourne une ou plusieurs interfaces IDebugBoundBreakpoint2 . L’interface GetBreakpointResolution retourne une interface IDebugBreakpointResolution2 et GetResolutionInfo retourne une union BP_RESOLUTION_INFO contenant le code ou le contexte de données.

Si le DE ne parvient pas à lier le point d’arrêt, il envoie une seule interface d’événement IDebugBreakpointErrorEvent2 au package de débogage. Le package de débogage récupère le type d’erreur (erreur ou avertissement) et le message d’information en appelant GetErrorBreakpoint, suivi de GetBreakpointResolution et GetResolutionInfo. Cette opération renvoie une structure BP_ERROR_RESOLUTION_INFO qui contient le type d’erreur et le message.

Si un DE gère un point d’arrêt mais ne peut pas le lier, il retourne une erreur de type BPET_TYPE_ERROR. Le package de débogage répond en affichant une boîte de dialogue d’erreur et l’IDE place un glyphe d’exclamation à l’intérieur du glyphe de point d’arrêt à gauche de la ligne de code source.

Si un DE gère un point d’arrêt, ne peut pas le lier, mais un autre DE peut le lier, il retourne un avertissement. L’IDE répond en plaçant un glyphe de question à l’intérieur du glyphe de point d’arrêt à gauche de la ligne de code source.