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

时间:2015-06-15 19:22:03

标签: visual-studio visual-studio-extensions vsix extensibility vs-extensibility

我需要我的Visual Studio扩展来响应调试事件。我已经注册了IDebugEventCallback2并且我收到了活动,但我为每个活动获得的是一个不透明的IDebugEvent2和一个Guid,其中许多不仅没有记录,而且还没有&# 39; t出现在网络上(或我的注册表中)。

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

或者我应该订阅其他一些活动家庭吗?

(更一般地说,我有一些方法可以找到有关发送到我的IDebugEventCallback2::Event回调的事件,当他们中的许多人不会出现在MSDN或其他任何地方时?谢谢!)

2 个答案:

答案 0 :(得分:4)

没有简单的方法可以做到这一点。诸如继续运行到游标之类的操作是Visual Studio实现的抽象,并且不对应于与调试引擎相关的任何唯一事件。调试引擎事件报告界面IDebugEventCallback2将使您仅在细粒度事件(例如创建断点或到达断点)时收到通知。

虽然Visual Studio允许您以编程方式执行继续运行到光标等操作,但它不会提供直接获取通知的方式。< / p>

您可以使用EnvDTE.DebuggerEvents.OnXxx事件在事情即将发生时收到通知。特别是,OnEnterBreakMode事件使您可以拦截断点并可能执行操作。您还可以使用事件处理程序中的当前EnvDTE.Debugger检查到达的断点的所有详细信息。

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

答案 1 :(得分:2)

你可能在这里走错了路,IDebugXxx接口真的是要创建你自己的调试引擎。仍然有用的可能是查看现有引擎中发生的情况,您可以使用QueryInterface()来发现与事件匹配的特定接口。与IDebugEngineCreateEvent2,IDebugProcessCreateEvent2,IDebugProcessDestroyEvent2等相同。它们有很多,它们列在VSSDK \ VisualStudioIntegration \ Common \ Inc \ msdbg.h标题中并包含它们的IID。

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

但是,是的,你不会得到一个&#34;继续调试&#34;这个事件。调试引擎不需要该事件,因为它已经负责自己处理它。它已经知道它何时调用IDebugProgram3 :: Continue()。

你当然要找的是IVsDebugger.AdviseDebuggerEvents()。这是告诉您内置调试器正在做什么的那个。您需要传递实现IVsDebuggerEvents的类的对象,将使用DBGMODE通知调用OnModeChanged()方法。我没有看到很多能够证明其用途的精彩示例,this web page可能会有所帮助。