在 Visual Studio 扩展中,获取调试器停止的函数的行范围

In a Visual Studio Extension, get the line range of the function in which the debugger is stopped

我有一个 Visual Studio 扩展程序可以挂接到调试事件中。当调试器停在一行代码时,我的 IDebugEventCallback2 回调被调用,我可以通过 IDebugThread2::EnumFrameInfo.

找到调试器停止的文件名和行号

我想知道当前函数跨越的源代码行的范围。

我希望可以从调试器接口中获取我需要的信息——调试器必须知道函数的行范围。如果那不可能,我愿意接受任何其他方法。在理想的世界中,该解决方案可以在没有项目系统的情况下工作——许多人,包括我自己,使用 Visual Studio 作为独立调试器而不使用项目系统。 (此外,我不能依赖 Roslyn - 它需要在 Visual Studio 的现有版本中工作。)

Edit:Carlos 使用 FileCodeModel 的方法效果很好,只要文件是项目的一部分。我还是很想知道有没有不需要项目系统的方法

给定一个FRAMEINFO retrieved with 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)获取有关代码元素和 start/end 点的信息,您必须使用自动化模型 (EnvDTE.ProjectItem.FileCodeModel)。给定一个 EnvDTE.ProjectItem 和一行代码,您可以使用例如:HOWTO: Get the code element at the cursor from a Visual Studio .NET macro or add-in