Я хочу сделать расширение для быстрого переключения на исключения 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.