Chcę zrobić rozszerzenie, aby szybko przełączać łamanie wyjątków CLR w debugerze.
Podjąłem próbę kilku podejść, z których żaden nie jest zadowalający.Jak ustawić "Przerwa na wszystkie wyjątki", z pakietu
Oto, co już próbowałem:
ExceptionSettings.SetBreakWhenThrown
(MSDN)
ten jest bardzo powolny (patrz this Connect issue). Próbowałem podejść od pytania "Toggle “Break when an exception is thrown.” using macro or keyboard shortcut" i nie wydaje się działać niezawodnie: w większości przypadków ustawia się tylko pole wyboru najwyższego poziomu, a nie faktycznie włamać się do wyjątków podczas debugowania.połączeń
DTE.ExecuteCommand("Debug.Exceptions")
aby wyświetlić okno, i nazywająSetWindowsHookEx
(MSDN) tuż przed tym, by przechwycić go, zanim pojawią się (tak, że nie ma lampy błyskowej dla użytkownika). Wydaje się to możliwe, ponieważ udało mi się przechwycić wiadomość i uzyskaćHWND
. Ale wygląda na to, że jest hacky i okno nie jest łatwe do manipulowania (ma dziwną kombinacjęSysListView32
ze specjalnymi polami wyboru iSysTreeView32
). Pozostawiam to jako rozwiązanie ostatniej szansy.jakoś
IDebugEngine2
(MSDN) dla kodu zarządzanego i nazywająIDebugEngine2.SetException
(MSDN) na początku sesji debugowania. Wydaje się to możliwe, ale mam problemy z uzyskaniem mechanizmu debugowania. Próbowałem podejście zIVsLoader
opisane on MSDN forums, ale jestem całkiem pewien, że daje mi nowe wystąpienie niezwiązane z sesji debugowania.Zadałem także pytanie tutaj: "Visual Studio: How to get IDebugEngine2 from VS Package (except IVsLoader)", ale nie otrzymałem rozwiązania.
Próbowałem, używając
IVsDebugger.AdviseDebugEventCallback
(MSDN) i przechodząc w realizacjiIDebugEventCallback2
(MSDN), ale zawsze jestem coraznull
dlapEngine
(i nieIDebugEngineCreateEvent2
albo).zrobić dostać
IDebugSessionCreateEvent2
(nieudokumentowane?) I można dostaćIDebugSession2
od niego, ale jegoSetException
wezwanie zawsze daje miHRESULT
o złym argumentem, więc może być brakuje czegoś tutaj (wywołanieSetException
na silniku zIVsLoader
daje OK, po prostu nie działa).
Czy istnieje inne podejście, które jest lepsze niż te lub czy coś przeoczyłem w istniejących?
UPDATE/UWAGA:
Jeśli znalazłeś na to pytanie, ponieważ chcesz szybciej „Przerwa na wszystkie wyjątki”, zrobiłem darmowe rozszerzenie można uzyskać z programu Visual Studio Gallery: Exception Breaker.
Zasługujesz na więcej niż tylko +1 za wysiłek, jaki włożysz w to pytanie, więc poświęciłem 3 godziny na opracowanie potencjalnego rozwiązania. :) Wydaje mi się, że teraz może odnosić się tylko do VS2012, ale mam nadzieję, że uda nam się go uruchomić również w 2010 roku. –
Naprawdę doceniam twoją pomoc! Moje umiejętności w tej chwili osiągnęły limit na niskim poziomie debugowania, więc utknąłem tam. Mam nadzieję, że to rozszerzenie zaoszczędzi ludziom znacznie więcej czasu, niż poświęciliśmy na badanie. –