如何以编程方式检查 Visual Studio 扩展中的堆栈?

How can I programmatically examine the stack in my Visual Studio extension?

在 VS 扩展中,假设代码刚刚遇到断点,并且处于中断模式。我如何以编程方式检查堆栈?另外,有没有办法找出最后执行的语句是什么?

我没能找到高级示例。有 hello-world type samples 但它们主要集中在 adding/modifying UI Visual Studio IDE.

中的元素

您需要连接到 EnvDTE.Events.DebuggerEvents.OnEnterBreakMode 事件或等效事件以了解进程何时停止(因此有一个调用堆栈)。小心保留对 EnvDTE.Events.DebuggerEvents 的引用,否则它可能会被垃圾收集并丢失与事件处理程序的连接(通常这在 C# 中不会发生,但由于 EnvDTE 事件 COM 包装器的实现方式,这是一个已知问题)。

调试器处于中断模式后,您可以像这样迭代 EnvDte.Debugger.CurrentThread.StackFrames

foreach (var frame in dte.Debugger.CurrentThread.StackFrames.Cast<EnvDTE.StackFrame>())
    ...

如果您希望修改当前 thread/stack 或获取比 EnvDTE 公开的更多详细信息,这也是可能的,但并非易事。有一个名为 IDebuggerInternal 的 COM 接口可以直接公开这些内容,但它不会从 public MS DLL 中导出。但是,由于它是一个 COM 接口,您可以在 C# 中重新声明它并将 SVsShellDebugger 实例转换为它。如果你想走这条路,我建议反汇编 Microsoft.VisualStudio.Debugger.Interop.Internal,Version=11.0.0.0(例如使用 dotPeek)以获取接口定义和 GUID。