Desidero creare un'estensione per attivare rapidamente l'interruzione delle eccezioni CLR nel debugger.
Ho provato diversi approcci, nessuno dei quali è soddisfacente.Come impostare "Interrompi tutte le eccezioni", da un pacchetto
Ecco quello che ho già provato:
ExceptionSettings.SetBreakWhenThrown
(MSDN)
Questo è estremamente lento (vedi this Connect issue). Ho provato gli approcci dalla domanda "Toggle “Break when an exception is thrown.” using macro or keyboard shortcut" e nessuno dei due sembra funzionare in modo affidabile: nella maggior parte dei casi viene impostata solo la casella di controllo di primo livello e in realtà non si interrompe sulle eccezioni durante il debug.chiamata
DTE.ExecuteCommand("Debug.Exceptions")
per visualizzare la finestra, e chiamareSetWindowsHookEx
(MSDN) poco prima che a intercettarlo prima che venga visualizzato (in modo che non v'è alcun flash per l'utente). Questo sembra possibile perché sono stato in grado di intercettare il messaggio e ottenereHWND
. Ma sembra hacky e la finestra non è così facile da manipolare correttamente (ha una strana combinazione diSysListView32
con caselle di controllo personalizzate eSysTreeView32
). Quindi lo lascio come ultima soluzione.In qualche modo ottenere
IDebugEngine2
(MSDN) per il codice gestito e chiamareIDebugEngine2.SetException
(MSDN) all'inizio della sessione di debug. Questo sembra possibile, ma sto riscontrando problemi nell'ottenere un motore di debug. Ho provato l'approccio conIVsLoader
descritto on MSDN forums, ma sono abbastanza sicuro che mi dà una nuova istanza non correlata alla sessione di debug.Ho anche posto la domanda qui: "Visual Studio: How to get IDebugEngine2 from VS Package (except IVsLoader)", ma non ho trovato una soluzione.
Ho provato con
IVsDebugger.AdviseDebugEventCallback
(MSDN) e passando in attuazione dellaIDebugEventCallback2
(MSDN), ma sto ottenendo semprenull
perpEngine
(e nessunIDebugEngineCreateEvent2
o).io capisco
IDebugSessionCreateEvent2
(non documentato?) E può ottenereIDebugSession2
da esso, ma la suaSetException
chiamata mi dà sempre unHRESULT
per argomento sbagliato, quindi mi potrebbe mancare qualcosa qui (chiamandoSetException
sul motore daIVsLoader
dà OK, basta non funziona).
C'è qualche altro approccio che è meglio di quelli o ho perso qualcosa in quelli esistenti?
UPDATE/NOTA:
Se hai trovato questa domanda, perché si desidera una più veloce "si interrompe su tutti Eccezioni", ho fatto un'estensione gratuita è possibile ottenere da Visual Studio Gallery: Exception Breaker.
Ti meriti più di un semplice +1 per lo sforzo che hai posto in questa domanda, quindi ho impiegato le ultime 3 ore a lavorare su una soluzione potenziale. :) Credo che al momento si possa applicare solo a VS2012, ma speriamo di poterlo fare anche nel 2010. –
Apprezzo molto il tuo aiuto! Le mie capacità hanno attualmente raggiunto il loro limite con il debug a basso livello, quindi sono rimasto bloccato lì. Spero che questa estensione salverà le persone molto più tempo di quanto abbiamo speso per studiarlo. –