【问题标题】:In a Visual Studio Extension, how to detect when the debugger Continues在 Visual Studio 扩展中,如何检测调试器何时继续
【发布时间】:2015-06-15 19:22:02
【问题描述】:

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

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

或者还有其他一些我应该订阅的事件系列吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    虽然 Visual Studio 使您能够以编程方式执行诸如继续运行到光标之类的操作,但它不提供在执行这些操作时获得通知的直接方式。

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

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

    【讨论】:

    • 谢谢! DebuggerEvents.OnEnterRunMode 似乎应该涵盖 Continue 的特定情况(或 Run to Cursor 之类的变体 - 我不需要区分) - 对吗?但是回到 IDebugEventCallback2,在调试 Visual Studio 之后,我发现事件 {29e2d4a0-503e-4e17-91ea-ea021570a857} 似乎与同一件事相对应(根据我在 Visual 中看到的内容,我将其称为“GUID_ExitBreakModeEvent”工作室堆栈)。我还使用 {ce6f92d3-4222-4b1e-830d-3ecff112bf22} 来检测调试器上下文何时发生变化 - 这合理吗?有更好的选择吗?
    • 事件 {29e2d4a0-503e-4e17-91ea-ea021570a857} 对应于一个内部接口Microsoft.VisualStudio.Debugger.Interop.Internal.IDebugExitBreakStateEvent,只要退出断点就会发生。这意味着它将发生在 Contine、Run to Cursor 和各种步骤上。
    • 我不确定您所说的“调试器上下文更改”是什么意思。
    • DebuggerEvents.OnEnterRunMode 就像IDebugExitBreakStateEvent
    • 非常感谢 - 这非常有帮助! “调试器上下文更改”是指,例如,通过在“调用堆栈”窗口中双击来切换到新的堆栈帧。对当前语句的更改 - 黄色指针位于边缘。
    【解决方案2】:

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

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

    但是,是的,您不会从中获得“继续调试”事件。调试引擎不需要该事件,因为它已经自行负责处理该事件。它已经知道何时调用 IDebugProgram3::Continue()。

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

    【讨论】:

    • 谢谢! OnModeChanged() 有效。值得注意的一点是:它会出现短暂的延迟,并且并不总是触发。如果你跨过一个需要很长时间才能运行的函数,你会得到一个 Run 事件,然后是一个 Break 事件,但如果你快速跨过一些东西,你只会得到一个 Break 事件。
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多