在VS扩展中,假设代码刚刚命中断点,并且处于中断模式。如何以编程方式检查堆栈?另外,有没有办法找出最后执行的语句是什么?
我还没能找到先进的样品。虽然有hello-world type samples,但它们主要集中于在Visual Studio IDE中添加/修改UI元素。
发布于 2020-06-25 23:49:49
您需要挂钩到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导出的。但是,由于它是一个COM接口,您可以在C#中重新声明它并将SVsShellDebugger实例强制转换为它。如果你想走这条路,我建议反汇编Microsoft.VisualStudio.Debugger.Interop.Internal,Version=11.0.0.0 (例如使用dotPeek),以获得接口定义和GUID。
https://stackoverflow.com/questions/62555122
复制相似问题