我想擴展以快速切換調試器中的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
,所以我可能會失去了一些東西(從IVsLoader
調用引擎SetException
給人OK,只是不起作用)。
有沒有其他的方法比那些更好或者我錯過了現有的東西?
UPDATE /注:
如果您發現了這個問題,因爲你想更快「的所有異常中斷」,我做了一個免費的擴展,你可以從Visual Studio庫得到:Exception Breaker。
因爲你對這個問題所付出的努力,你值得的不僅僅是+1,所以我在過去的3個小時裏研究了一個潛在的解決方案。 :)我相信它現在可能只適用於VS2012,但希望我們也能在2010年進行。 – 2013-03-23 23:23:12
我真的很感謝你的幫助!我的技能目前在低級調試中達到極限,所以我被困在那裏。我希望這個擴展可以爲人們節省比我們花費的時間更多的時間。 – 2013-03-24 00:58:52