在 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
我有一个 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