我有一个Visual Studio扩展,可以挂钩调试事件。当调试器在一行代码处停止时,我的IDebugEventCallback2
回调被调用,我可以通过IDebugThread2::EnumFrameInfo
找到调试器停止的文件名和行号。
我想知道当前函数跨越的源代码行的范围。
我希望可以从调试器接口获取我需要的信息 - 调试器必须知道函数的行范围。如果那是不可能的,我可以接受任何其他方法。在理想的世界中,解决方案可以在没有项目系统的情况下工作 - 包括我自己在内的许多人使用Visual Studio作为独立的调试器而不使用项目系统。 (另外,我不能依赖Roslyn - 它需要在现有版本的Visual Studio中工作。)
修改:只要该文件是项目的一部分,Carlos使用FileCodeModel
的方法就可以正常运行。我仍然想知道是否有一种方法不需要项目系统。
答案 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