В расширении Visual Studio получите диапазон строк функции, в которой остановлен отладчик.

У меня есть расширение Visual Studio, которое подключается к событиям отладки. Когда отладчик останавливается на строке кода, вызывается мой обратный вызов IDebugEventCallback2, и я могу узнать имя файла и номер строки, где остановился отладчик, через IDebugThread2::EnumFrameInfo.

Я хотел бы знать диапазон строк исходного кода, который охватывает текущая функция.

Я надеюсь, что можно получить нужную мне информацию из интерфейсов отладчика - отладчик должен знать линейный диапазон функций. Если это невозможно, я открыт для других методов. В идеальном мире решение работало бы без системы проектов - многие люди, включая меня, используют Visual Studio в качестве автономного отладчика без использования системы проектов. (Кроме того, я не могу полагаться на Roslyn - он должен работать в существующих версиях Visual Studio.)

Изменить: метод Карлоса с использованием FileCodeModel работает хорошо, если файл является частью проекта. Я все еще хотел бы знать, есть ли метод, который не требует системы проектов.


person RichieHindle    schedule 16.06.2015    source источник


Ответы (1)


Учитывая FRAMEINFO, полученный с помощью IEnumDebugFrameInfo2.Next, вы можете использовать следующий код, чтобы получить имя файла, первую строку кода текущего кадра. и текущая строка кода:

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, интерфейс IDebugDocumentContext2 имеет метод Seek, который позволяет продвигать строки или операторы кода в кадре стека. Я думаю, вы можете продвигаться до тех пор, пока не получите конечную строку кода кадра стека.

Чтобы получить информацию об элементах кода и начальных / конечных точках с использованием системы проектов (и без Roslyn), вам необходимо использовать модель автоматизации (EnvDTE.ProjectItem.FileCodeModel). Учитывая EnvDTE.ProjectItem и строку кода, вы можете использовать, например: HOWTO: получить элемент кода на курсоре из макроса или надстройки Visual Studio .NET

person Carlos Quintero    schedule 19.06.2015
comment
Спасибо, но для меня это не совсем подходит. GetSourceRange() возвращает диапазон текущего оператора, а не весь кадр, а Seek() возвращает 0x80004001 Не реализовано из отладчика C ++. (Не мой отрицательный голос, кстати.) (И спасибо за указатель на вашу отличную статью CodeModel, которую я уже просматривал. :-)) - person RichieHindle; 19.06.2015