Я хочу сделать расширение для быстрого переключения на исключения CLR в отладчике.
Я сделал несколько попыток, ни один из которых не является удовлетворительным.
Вот что я уже пробовал:
-
ExceptionSettings.SetBreakWhenThrown(MSDN)
Это очень медленно (см. эта проблема подключения). Я пробовал подходы к вопросу "Toggle "Перерыв при вызове исключения" с использованием макроса или сочетания клавиш" и, похоже, не работают надежно: в большинстве случаев только верхний уровень checkbox устанавливается, и при отладке он фактически не прерывает исключения. -
Вызовите
DTE.ExecuteCommand("Debug.Exceptions"), чтобы отобразить окно, и вызовитеSetWindowsHookEx(MSDN) перед этим для перехвата перед тем, как он появится (чтобы не было вспышки для пользователя). Это кажется возможным, поскольку я смог перехватить сообщение и получитьHWND. Но кажется, что взломать и окно не так легко манипулировать должным образом (у него есть какая-то странная комбинацияSysListView32с пользовательскими флажками иSysTreeView32). Поэтому я оставляю это как последнее решение. -
Как-то получить
IDebugEngine2(MSDN) для управляемого кода и вызватьIDebugEngine2.SetException(MSDN) в начале сеанса отладки. Это кажется возможным, но у меня возникают проблемы с отладчиком. Я пробовал использоватьIVsLoaderна форумах MSDN, но я уверен, что он дает мне новый экземпляр, не имеющий отношения к сеансу отладки.Я также задал здесь вопрос: "Visual Studio: как получить IDebugEngine2 из пакета VS (кроме IVsLoader)", но не получил решения.
Я попытался использовать
IVsDebugger.AdviseDebugEventCallback(MSDN) и передать в реализациюIDebugEventCallback2(MSDN), но я всегда получаюnullдляpEngine(и noIDebugEngineCreateEvent2).Я получаю
IDebugSessionCreateEvent2(недокументированный?) и могу получитьIDebugSession2от него, но его вызовSetExceptionвсегда дает мнеHRESULTдля неправильного аргумента, поэтому я мог бы здесь что-то пропустить (вызовSetExceptionна двигателе отIVsLoaderдает ОК, просто не работает).
Есть ли другой подход, который лучше, чем те, или я что-то пропустил в существующих?
UPDATE/Примечание:
Если вы нашли этот вопрос, потому что вам нужен более быстрый "Break on All Exceptions", я сделал бесплатное расширение, которое вы можете получить в галерее Visual Studio: Exception Breaker.