如何以编程方式检查 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。
在 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。