6

Mam rozszerzenie Visual Studio, które przechwytuje do zdarzeń debugowania. Kiedy debugger zatrzymuje się na linii kodu, mój callback IDebugEventCallback2 zostaje wywołany i mogę znaleźć nazwę pliku i numer linii, gdzie debugger zatrzymał się przez IDebugThread2::EnumFrameInfo.W programie Visual Studio Extension uzyskaj zakres linii funkcji, w której jest zatrzymywany debugowanie.

Chciałbym poznać zakres linii kodu źródłowego, który obejmuje obecną funkcję.

Mam nadzieję, że możliwe jest uzyskanie potrzebnych informacji z interfejsów debuggera - debugger musi znać zakres linii funkcji. Jeśli to nie jest możliwe, jestem otwarty na wszelkie inne metody. W idealnym świecie rozwiązanie byłoby działać bez systemu projektowego - wiele osób, włącznie z mną, używa Visual Studio jako niezależnego debuggera bez korzystania z systemu projektu. (Również, nie mogę polegać na Roslyn - to musi działać w obecnych wersjach Visual Studio).

Edit: metoda Carlosa korzystania FileCodeModel działa dobrze, dopóki plik jest częścią projektu. Nadal chciałbym wiedzieć, czy istnieje metoda, która nie wymaga systemu projektu.

Odpowiedz

0

Biorąc pod uwagę FRAMEINFO pobierane z IEnumDebugFrameInfo2.Next, można użyć następującego kodu, aby uzyskać nazwę pliku, pierwsza linia kodu bieżącej ramki i bieżącą linię kodu:

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, tym IDebugDocumentContext2 Interfejs ma metodę Seek, która pozwala przesuwać linie lub instrukcje kodu w ramce stosu. Sądzę, że możesz przejść do momentu, w którym nie uzyskasz końcowej linii kodu ramki stosu.

Aby uzyskać informacje o elementach kodu i punktach początkowych/końcowych za pomocą systemu projektu (i bez programu Roslyn), należy użyć modelu automatyzacji (EnvDTE.ProjectItem.FileCodeModel). Biorąc pod uwagę EnvDTE.ProjectItem i linię kodu, można użyć na przykład: HOWTO: Get the code element at the cursor from a Visual Studio .NET macro or add-in

+0

Dzięki, ale to nie działa dla mnie. 'GetSourceRange()' zwraca zakres bieżącej instrukcji, a nie całej ramki, a 'Seek()' zwraca 0x80004001 "Nie zaimplementowane" z debuggera C++. (Nie mój downwinter, BTW.) (I dzięki za wskazówkę do twojego wspaniałego artykułu CodeModel, który już obejrzałem. :-)) – RichieHindle