Condividi tramite


Associare punti di interruzione

Se l'utente imposta un punto di interruzione, ad esempio premendo F9, l'IDE formula la richiesta e richiede alla sessione di debug di creare il punto di interruzione.

Imposta punto di interruzione

L'impostazione di un punto di interruzione è un processo in due passaggi, perché il codice o i dati interessati dal punto di interruzione potrebbero non essere ancora disponibili. Prima di tutto, il punto di interruzione deve essere descritto e quindi, man mano che il codice o i dati diventano disponibili, deve essere associato a tale codice o dati, come indicato di seguito:

  1. Il punto di interruzione viene richiesto dai motori di debug pertinenti e quindi il punto di interruzione viene associato al codice o ai dati non appena diventa disponibile.

  2. La richiesta del punto di interruzione viene inviata alla sessione di debug, che la invia a tutte le DE pertinenti. Qualsiasi DE che sceglie di gestire il punto di interruzione crea un punto di interruzione in sospeso corrispondente.

  3. La sessione di debug raccoglie i punti di interruzione in sospeso e li invia al pacchetto di debug (il componente di debug di Visual Studio).

  4. Il pacchetto di debug richiede alla sessione di debug di associare il punto di interruzione in sospeso al codice o ai dati. La sessione di debug invia questa richiesta a tutti gli interessati.

  5. Se de è in grado di associare il punto di interruzione, invia un evento associato a punti di interruzione alla sessione di debug. In caso contrario, invia un evento di errore del punto di interruzione.

Punti di interruzione in sospeso

Un punto di interruzione in sospeso può essere associato a più posizioni di codice. Ad esempio, una riga di codice sorgente per un modello C++ può essere associata a ogni sequenza di codice generata dal modello. La sessione di debug può utilizzare un evento associato a punti di interruzione per enumerare i contesti di codice associati a un punto di interruzione al momento dell'invio dell'evento. Più contesti di codice possono essere associati in un secondo momento, quindi l'associazione DE può inviare più eventi associati a punti di interruzione per ogni richiesta di associazione. Tuttavia, un DE deve inviare un solo evento di errore del punto di interruzione per ogni richiesta di associazione.

Implementazione

A livello di codice, il pacchetto di debug chiama il gestore di debug della sessione (SDM) e fornisce un'interfaccia IDebugBreakpointRequest2 che esegue il wrapping di una struttura BP_REQUEST_INFO , che descrive il punto di interruzione da impostare. Anche se i punti di interruzione possono essere di molti moduli, in definitiva si risolvono in un codice o in un contesto dati.

Il SDM passa questa chiamata a ogni DE pertinente chiamando il relativo metodo CreatePendingBreakpoint . Se il de sceglie di gestire il punto di interruzione, crea e restituisce un'interfaccia IDebugPendingBreakpoint2 . SDM raccoglie queste interfacce e le passa di nuovo al pacchetto di debug come singola IDebugPendingBreakpoint2 interfaccia.

Finora non sono stati generati eventi.

Il pacchetto di debug tenta quindi di associare il punto di interruzione in sospeso al codice o ai dati chiamando Bind, implementato da DE.

Se il punto di interruzione è associato, de invia un'interfaccia evento IDebugBreakpointBoundEvent2 al pacchetto di debug. Il pacchetto di debug usa questa interfaccia per enumerare tutti i contesti di codice (o il singolo contesto di dati) associato al punto di interruzione chiamando EnumBoundBreakpoints, che restituisce una o più interfacce IDebugBoundBreakpoint2 . L'interfaccia GetBreakpointResolution restituisce un'interfaccia IDebugBreakpointResolution2 e GetResolutionInfo restituisce un'unione BP_RESOLUTION_INFO contenente il codice o il contesto dati.

Se DE non è in grado di associare il punto di interruzione, invia un'unica interfaccia evento IDebugBreakpointErrorEvent2 al pacchetto di debug. Il pacchetto di debug recupera il tipo di errore (errore o avviso) e il messaggio informativo chiamando GetErrorBreakpoint, seguito da GetBreakpointResolution e GetResolutionInfo. Viene restituita una struttura BP_ERROR_RESOLUTION_INFO che contiene il tipo di errore e il messaggio.

Se un de gestisce un punto di interruzione ma non può associarlo, restituisce un errore di tipo BPET_TYPE_ERROR. Il pacchetto di debug risponde visualizzando una finestra di dialogo di errore e l'IDE inserisce un glifo esclamativo all'interno del glifo del punto di interruzione a sinistra della riga del codice sorgente.

Se un de gestisce un punto di interruzione, non può associarlo, ma un altro DE potrebbe associarlo, restituisce un avviso. L'IDE risponde inserendo un glifo della domanda all'interno del glifo del punto di interruzione a sinistra della riga del codice sorgente.