【问题标题】:How can I programmatically examine the stack in my Visual Studio extension?如何以编程方式检查 Visual Studio 扩展中的堆栈?
【发布时间】:2020-10-14 17:12:10
【问题描述】:

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

我找不到高级示例。有hello-world type samples,但它们主要专注于在 Visual Studio IDE 中添加/修改 UI 元素。

【问题讨论】:

  • 最后执行的语句永远丢失,但下一个要执行的语句的当前行(可能还有开始列+结束行/列)可以通过EnvDTE获得。

标签: visual-studio vsix envdte vs-extensibility


【解决方案1】:

您需要挂钩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>())
    ...

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

【讨论】:

  • 谢谢。接受你的回答并点赞并不能真正表达我的感激之情。
  • 运行起来了! :) ibb.co/qC1jVmL 再次感谢您的帮助。我还没有参加那个活动。相反,我在遇到断点时手动运行我的扩展。接下来是让它与事件一起工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多