6

Ich habe eine Visual Studio-Erweiterung, die Debugging-Ereignisse einhakt. Wenn der Debugger an einer Codezeile anhält, wird mein IDebugEventCallback2 Callback aufgerufen, und ich kann den Dateinamen und die Zeilennummer herausfinden, wo der Debugger über IDebugThread2::EnumFrameInfo gestoppt wurde.Erhalten Sie in einer Visual Studio-Erweiterung den Zeilenbereich der Funktion, in der der Debugger gestoppt wird

Ich möchte den Bereich der Quellcodezeilen, die die aktuelle Funktion umfasst, kennen.

Ich hoffe, es ist möglich, die Informationen, die ich brauche von den Debugger-Schnittstellen abzuleiten - der Debugger muss den Zeilenbereich der Funktionen kennen. Wenn das nicht möglich ist, bin ich offen für andere Methoden. In einer idealen Welt würde die Lösung ohne das Projektsystem funktionieren - viele Leute, mich eingeschlossen, verwenden Visual Studio als eigenständigen Debugger, ohne das Projektsystem zu verwenden. (Auch ich kann nicht auf Roslyn verlassen - es muss in den bestehenden Versionen von Visual Studio arbeiten.)

bearbeiten: Carlos Methode der Verwendung von FileCodeModel funktioniert gut, solange die Datei Teil eines Projekts ist. Ich würde immer noch gerne wissen, ob es eine Methode gibt, die das Projektsystem nicht benötigt.

Antwort

0

Bei einem FRAMEINFO mit IEnumDebugFrameInfo2.Next abgerufen, können Sie den folgenden Code verwenden, um die Dateinamen zu bekommen, die erste Zeile des Codes des aktuellen Rahmens und die aktuelle Codezeile:

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, die IDebugDocumentContext2 Schnittstelle hat eine Seek Methode, mit der Sie Zeilen oder Anweisungen von Code im Stapelrahmen weiterleiten können. Ich schätze, Sie können weiterschalten, bis Sie die Endzeile des Stack-Frames nicht mehr erhalten.

Um Informationen über Codeelemente und Start-/Endpunkte über das Projektsystem (und ohne Roslyn) zu erhalten, müssen Sie das Automationsmodell (EnvDTE.ProjectItem.FileCodeModel) verwenden. Ein EnvDTE.ProjectItem und eine Codezeile vorausgesetzt, können Sie zum Beispiel verwenden: HOWTO: Get the code element at the cursor from a Visual Studio .NET macro or add-in

+0

Danke, aber das funktioniert nicht ganz für mich. 'GetSourceRange()' liefert den Bereich der aktuellen Anweisung, nicht den ganzen Rahmen, und 'Seek()' gibt 0x80004001 "Not implemented" vom C++ - Debugger zurück. (Nicht mein Downvote, BTW.) (Und danke für den Hinweis auf Ihren ausgezeichneten CodeModel Artikel, den ich mir schon angeschaut hatte. :-)) – RichieHindle