【发布时间】:2013-03-13 00:59:21
【问题描述】:
我想制作一个扩展来快速切换调试器中的 CLR 异常中断。
我尝试了几种方法,都没有令人满意。
这是我已经尝试过的:
ExceptionSettings.SetBreakWhenThrown(MSDN)
这非常慢(请参阅this Connect issue)。我已经尝试了来自问题“Toggle “Break when an exception is thrown.” using macro or keyboard shortcut”的方法,但似乎都不能可靠地工作:在大多数情况下,只有顶级复选框被设置,并且在调试时它实际上并没有因异常而中断。调用
DTE.ExecuteCommand("Debug.Exceptions")显示窗口,并在此之前调用SetWindowsHookEx(MSDN) 在它出现之前拦截它(这样用户就不会闪现)。这似乎是可能的,因为我能够拦截消息并获得HWND。但它似乎很hacky,并且窗口不是那么容易正确操作(它有SysListView32与自定义复选框和SysTreeView32的一些奇怪组合)。所以我把它作为最后的解决方案。-
以某种方式获取托管代码的
IDebugEngine2(MSDN) 并在调试会话开始时调用IDebugEngine2.SetException(MSDN)。这似乎是可能的,但我在获取调试引擎时遇到了问题。我已经尝试过使用IVsLoader描述的on MSDN forums 的方法,但我很确定它给了我一个与调试会话无关的新实例。我也在这里问过这个问题:“Visual Studio: How to get IDebugEngine2 from VS Package (except IVsLoader)”,但没有得到解决。
我尝试使用
IVsDebugger.AdviseDebugEventCallback(MSDN) 并传入IDebugEventCallback2(MSDN) 的实现,但我总是得到null用于pEngine(也没有IDebugEngineCreateEvent2)。我确实得到了
IDebugSessionCreateEvent2(未记录?)并且可以从中得到IDebugSession2,但它的SetException调用总是给我一个HRESULT用于错误的论点,所以我可能在这里遗漏了一些东西(调用@987654350 @ on engine fromIVsLoader给出了 OK,只是不起作用)。
是否有其他方法比这些方法更好,或者我错过了现有方法中的某些内容?
更新/注意:
如果你发现这个问题是因为你想要一个更快的“打破所有异常”,我已经做了一个免费的扩展,你可以从 Visual Studio Gallery 获得:Exception Breaker。
【问题讨论】:
-
您在这个问题上付出的努力不仅值得 +1,因此我在过去 3 小时内投入了潜在的解决方案。 :) 我相信它现在可能只适用于 VS2012,但希望我们也能在 2010 年实现它。
-
非常感谢您的帮助!我的技能目前在低级调试方面达到了极限,所以我被困在那里。我希望这个扩展能够为人们节省比我们花在研究上更多的时间。
标签: .net visual-studio-2010 visual-studio visual-studio-debugging visual-studio-extensions