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

Ric*_*dle 6 extensibility visual-studio vs-extensibility vsix visual-studio-extensions

我有一个Visual Studio扩展,它挂钩到调试事件.当调试器在一行代码处停止时,我的IDebugEventCallback2回调被调用,我可以找到调试器已经停止的文件名和行号IDebugThread2::EnumFrameInfo.

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

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

编辑:FileCodeModel只要文件是项目的一部分,Carlos的使用方法效果很好.我仍然想知道是否有一种不需要项目系统的方法.

Car*_*ero 0

给定使用IEnumDebugFrameInfo2.Next检索到的FRAMEINFO,您可以使用以下代码来获取文件名、当前帧的第一行代码和当前代码行:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

FWIW,IDebugDocumentContext2 接口有一个Seek方法,允许您在堆栈帧中前进代码行或语句。我想你可以前进直到无法获取堆栈帧的代码结束行。

要使用项目系统(并且不使用 Roslyn)获取有关代码元素和开始/结束点的信息,您必须使用自动化模型 (EnvDTE.ProjectItem.FileCodeModel)。给定一个 EnvDTE.ProjectItem 和一行代码,您可以使用以下示例:HOWTO:从 Visual Studio .NET 宏或加载项获取光标处的代码元素