我想进行扩展以在调试器中快速切换 CLR 异常的中断。
我已经尝试了几种方法,但都不是令人满意的。
这是我已经尝试过的:
ExceptionSettings.SetBreakWhenThrown
(MSDN)
这非常慢(请参阅此连接问题)。我已经尝试了来自问题“ Toggle “Break when an exception is throwed.”中的方法。使用宏或键盘快捷键“并且似乎都不能可靠地工作:在大多数情况下,只有顶级复选框被设置,并且在调试时它实际上不会因异常而中断。调用
DTE.ExecuteCommand("Debug.Exceptions")
以显示窗口,并在此之前调用SetWindowsHookEx
( MSDN ) 以在它出现之前拦截它(这样用户就不会闪现)。这似乎是可能的,因为我能够拦截消息并获取HWND
. 但它似乎很hacky,并且窗口并不容易正确操作(它SysListView32
与自定义复选框和有一些奇怪的组合SysTreeView32
)。所以我把它作为最后的机会解决方案。在调试会话开始时以某种方式获取
IDebugEngine2
( MSDN ) 托管代码和调用IDebugEngine2.SetException
( MSDN )。这似乎是可能的,但我在获取调试引擎时遇到了问题。我已经尝试过在 MSDN 论坛上IVsLoader
描述的方法,但我很确定它给了我一个与调试会话无关的新实例。我也在这里问过这个问题:“ Visual Studio: How to get IDebugEngine2 from VS Package (except IVsLoader) ”,但没有得到解决方案。
我尝试过使用
IVsDebugger.AdviseDebugEventCallback
(MSDN)并传入IDebugEventCallback2
(MSDN)的实现,但我总是得到null
(pEngine
也没有IDebugEngineCreateEvent2
)。我确实得到了
IDebugSessionCreateEvent2
(未记录的?)并且可以从中得到IDebugSession2
,但是它的SetException
调用总是给我一个HRESULT
错误的论点,所以我可能在这里遗漏了一些东西(SetException
从引擎调用IVsLoader
给了确定,只是不起作用)。
是否有其他方法比这些方法更好,或者我错过了现有方法中的某些内容?
更新/注意:
如果你发现这个问题是因为你想要一个更快的“打破所有异常”,我做了一个免费的扩展,你可以从 Visual Studio Gallery 获得:Exception Breaker。