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

时间:2015-06-16 12:48:47

标签: visual-studio visual-studio-extensions vsix extensibility vs-extensibility

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

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

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

修改:只要该文件是项目的一部分,Carlos使用FileCodeModel的方法就可以正常运行。我仍然想知道是否有一种方法不需要项目系统。

1 个答案:

答案 0 :(得分:0)

如果使用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: Get the code element at the cursor from a Visual Studio .NET macro or add-in