在 Visual Studio 扩展中,如何检测调试器何时继续

In a Visual Studio Extension, how to detect when the debugger Continues

我需要 Visual Studio 扩展来对调试事件做出反应。我已经注册了一个 IDebugEventCallback2 并且我正在接收事件,但是我从每个事件中得到的只是一个不透明的 IDebugEvent2 和一个 Guid,其中许多不仅没有记录而且没有出现在任何地方网络(或在我的注册表中)。

我目前的具体要求是知道进程何时继续 - 即。用户点击了继续、运行 光标等。我应该寻找什么 Guid?

或者是否有我应该订阅的其他事件系列?

(更一般地说,当许多事件没有出现在 MSDN 或其他任何地方时,我是否缺少某种方法来了解传送到我的 IDebugEventCallback2::Event 回调的事件?谢谢!)

您可能误会了,IDebugXxx 接口实际上是为了创建您自己的调试引擎。也许对于查看现有引擎中正在发生的事情仍然有用,您应该使用 QueryInterface() 来发现与事件匹配的特定接口。像 IDebugEngineCreateEvent2、IDebugProcessCreateEvent2、IDebugProcessDestroyEvent2 等。它们有很多,它们列在 VSSDK\VisualStudioIntegration\Common\Inc\msdbg.h header 中并包括它们的 IID。

最好的办法是查看 this sample,它显示了如何将事件通知破解到特定接口中。 AD7Events.cs 源文件显示包装器。请记住,制作此示例是为了展示如何创建引擎,而不是如何使用 VS 中已内置的引擎。

但是,是的,您不会从中得到一个 "continue debug" 事件。调试引擎不需要该事件,因为它已经负责自行处理该事件。它已经知道何时调用 IDebugProgram3::Continue().

您正在寻找的肯定是 IVsDebugger.AdviseDebuggerEvents(). That's the one that tells you what the built-in debugger is doing. You need to pass an object of a class that implements IVsDebuggerEvents, your OnModeChanged() method will be called with a DBGMODE notification. I don't see a lot of fantastic examples that demonstrate usage, this web page 可能会有帮助。

没有简单的方法可以做到这一点。 Continue运行 cursor 等操作是由 Visual Studio 实现的抽象,不对应于任何唯一事件) 关于调试引擎。调试引擎事件报告界面 IDebugEventCallback2 将使您能够仅在创建断点或到达断点时等细粒度事件上得到通知。

虽然 Visual Studio 使您能够以编程方式执行 Continue运行 cursor 等操作,但它确实没有提供在他们被带走时得到通知的直接方式。

您可以在事件处理程序中使用 EnvDTE.DebuggerEvents.OnXxx events to get notified when something is about to happen. In particular, the OnEnterBreakMode event enables you to intercept a breakpoint hit and possibly take an action. You can also inspect all the details of the reached breakpoint(s) using the current EnvDTE.Debugger

现在,通过一些努力,您可以使用这些构造来实现与所有 Visual Studio 调试操作相对应的事件,包括 Continue运行 cursor 准确。如果您需要 EnvDTE.DebuggerEvents 未提供的其他事件(例如插入断点时),您别无选择,只能使用 IDebugEventCallback2.Event。在这种情况下,如果您有特定事件的想法,请明确提及它们,我可能会告诉您相应的 IDebugEventCallback2.Event GUID。