6

Ho un'estensione di Visual Studio che si aggancia agli eventi di debug. Quando il debugger si arresta su una riga di codice, viene richiamata la mia chiamata IDebugEventCallback2 e riesco a trovare il nome file e il numero di riga in cui il debugger è stato arrestato tramite IDebugThread2::EnumFrameInfo.In un'estensione di Visual Studio, ottenere l'intervallo di righe della funzione in cui viene arrestato il debugger

Mi piacerebbe conoscere l'intervallo di linee di codice sorgente che la funzione corrente si estende.

Spero sia possibile ricavare le informazioni necessarie dalle interfacce del debugger: il debugger deve conoscere l'intervallo di funzioni delle righe. Se ciò non è possibile, sono aperto a qualsiasi altro metodo. In un mondo ideale la soluzione funzionerebbe senza il sistema di progetto: molte persone, me compreso, utilizzano Visual Studio come debugger autonomo senza utilizzare il sistema di progetto. (Inoltre, io non posso contare su Roslyn - ha bisogno di lavorare nelle versioni esistenti di Visual Studio.)

Edit: metodo di utilizzo di FileCodeModel funziona bene, a patto che il file è parte di un progetto di Carlos. Mi piacerebbe ancora sapere se esiste un metodo che non richiede il sistema di progetto.

risposta

0

Dato un FRAMEINFO recuperata con IEnumDebugFrameInfo2.Next, è possibile utilizzare il seguente codice per ottenere il nome del file, la prima riga di codice del frame corrente e l'attuale linea di codice:

IDebugStackFrame2 stackFrame = frmInfo.m_pFrame; 
if (stackFrame != null) 
{ 
    TEXT_POSITION[] begin = new TEXT_POSITION[1]; 
    TEXT_POSITION[] end = new TEXT_POSITION[1]; 
    IDebugDocumentContext2 debugDocumentContext2; 
    stackFrame.GetDocumentContext(out debugDocumentContext2); 
    if (debugDocumentContext2 != null) 
    { 
     string fileName; 
     debugDocumentContext2.GetName((uint)enum_GETNAME_TYPE.GN_FILENAME, out fileName); 
     debugDocumentContext2.GetSourceRange(begin, end); 
    } 
} 

FWIW, l'IDebugDocumentContext2 l'interfaccia ha un metodo Seek che consente di far avanzare linee o istruzioni di codice nel frame dello stack. Immagino che tu possa avanzare fino a quando non riuscirai a ottenere la fine del codice del frame dello stack.

Per ottenere informazioni sugli elementi del codice e sui punti di inizio/fine utilizzando il sistema del progetto (e senza Roslyn), è necessario utilizzare il modello di automazione (EnvDTE.ProjectItem.FileCodeModel). Dato un EnvDTE.ProjectItem e una riga di codice, è possibile utilizzare ad esempio: HOWTO: Get the code element at the cursor from a Visual Studio .NET macro or add-in

+0

Grazie, ma questo non funziona per me. 'GetSourceRange()' restituisce l'intervallo dell'istruzione corrente, non l'intero frame, e 'Seek()' restituisce 0x80004001 "Non implementato" dal debugger C++. (Non è il mio downvote, BTW.) (E grazie per il puntatore al tuo eccellente articolo CodeModel, che avevo già visto. :-)) – RichieHindle