Toggle "Перерыв при вызове исключения". с помощью макроса или сочетания клавиш
Изменить: новое окно исключения Visual Studio 2015 намного быстрее, чем старый диалог, о котором я больше не забочусь об использовании клавиатуры ярлык для него.
Есть ли макрокоманда или комбинация клавиш, которая будет переключать "перерыв при вызове исключения" без использования графического интерфейса?
Открытие диалога с помощью ctrl + alt + e и проверка "Исключения общего времени выполнения языка" "Брошено", а затем нажмите "ОК" достаточно просто, но это то, что я делаю много. Я бы предпочел использовать для этого сочетание клавиш.
Этот вопрос является дубликатом
У кого-нибудь есть ярлык/макрос Visual Studio для переключения прерываний на обработанные/необработанные исключения?
Тем не менее, плакат принял ответ, который на самом деле не работает, и мне очень хотелось бы ответить, что работает.
Ответ в дублированном вопросе неприемлем, поскольку он переключает только одно конкретное исключение, а не всю группу CLR.
"Тогда напишите петлю". ты говоришь. Но не так быстро! Кто-то пробовал это уже, и это было бесполезно медленно. (Да, я проверял, что он медленный и в моей системе.)
Таким образом, задача состоит в том, чтобы использовать макрос для переключения всей категории исключений CLR менее чем за 1 или 2 секунды.
Этот вопрос является дубликатом
У кого-нибудь есть ярлык/макрос Visual Studio для переключения прерываний на обработанные/необработанные исключения?
Ответы
Ответ 1
Я создал бесплатное расширение Visual Studio, которое может сделать это надежно: Exception Breaker.
Он использует недокументированный вызов IDebugSession2.SetException
, который выполняется очень быстро: все исключения устанавливаются/удаляются в течение от 20 до 60 миллисекунд.
Ответ 2
Очень похоже на другой ответ, но для группы есть специальный ExceptionSetting.
Dim dbg As EnvDTE90.Debugger3 = DTE.Debugger
Dim exSettings As EnvDTE90.ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
Dim exSetting As EnvDTE90.ExceptionSetting
Try
exSetting = exSettings.Item("Common Language Runtime Exceptions")
Catch ex As COMException
If ex.ErrorCode = -2147352565 Then
exSetting = exSettings.NewException("Common Language Runtime Exceptions", 0)
End If
End Try
If exSetting.BreakWhenThrown Then
exSettings.SetBreakWhenThrown(False, exSetting)
Else
exSettings.SetBreakWhenThrown(True, exSetting)
End If
Ответ 3
Здесь Bryce Kahle очень полезный макрос, вслепую обновленный для запуска в VS2010:
Sub ToggleExceptions()
Dim dbg As EnvDTE100.Debugger5 = DTE.Debugger
Dim exSettings As ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
Dim exSetting As ExceptionSetting
Try
exSetting = exSettings.Item("Common Language Runtime Exceptions")
Catch ex As COMException
If ex.ErrorCode = -2147352565 Then
exSetting = exSettings.NewException("Common Language Runtime Exceptions", 0)
End If
End Try
If exSetting.BreakWhenThrown Then
exSettings.SetBreakWhenThrown(False, exSetting)
Else
exSettings.SetBreakWhenThrown(True, exSetting)
End If
End Sub
Ответ 4
Сначала я инициализировал таймер, затем я вызываю команду Exception.Debug.
Таймер попадает, когда модальный диалог открыт.
Если вы используете Win 7 с деактивированным UAC SendKeys с ALT-Key, вы не сработаете... я не знаю почему.
Я немного поиграл... попробуйте это (VS2010 EN):
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Imports System.Runtime.InteropServices
'...
Private WithEvents t As Timers.Timer
Private Sub t_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles t.Elapsed
t.Stop()
' Tastatureingaben simulieren
System.Windows.Forms.SendKeys.SendWait("{DOWN}")
System.Threading.Thread.Sleep(1500) ' Pause wichtig zum Laden des Exceptionbaums
System.Windows.Forms.SendKeys.SendWait("%t")
System.Windows.Forms.SendKeys.SendWait("{ENTER}")
End Sub
Public Sub toggleCLRExceptions()
If DTE.Solution.Count <= 0 Then
MsgBox("Nicht ohne geöffnete Solution!")
Exit Sub
End If
' Timer wird benötigt, da der Dialog Modal ist
' und weitere Befehle im Macro werden erst nach beenden des Dialogs ausgeführt
t = New Timers.Timer()
t.Interval = 0.5
t.Start()
DTE.ExecuteCommand("Debug.Exceptions")
'System.Windows.Forms.SendKeys.SendWait("^%e") ' alternativ: STRG+ALT+e
System.Threading.Thread.Sleep(200)
If isCLRExceptionsActive() Then
MsgBox("BREAK @CLR-Exception", MsgBoxStyle.Information, "Info")
Else
MsgBox("NO BREAK @CLR-Exception", MsgBoxStyle.Information, "Info")
End If
End Sub
Function isCLRExceptionsActive() As Boolean
' prüft, ob Setting Debug CLR-Exceptions aktiviert/deaktivert ist
Dim dbg As EnvDTE100.Debugger5 = DTE.Debugger
Dim exSettings As ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
Dim exSetting As ExceptionSetting
Try
exSetting = exSettings.Item("Common Language Runtime Exceptions")
Catch ex As COMException
If ex.ErrorCode = -2147352565 Then
exSetting = exSettings.NewException("Common Language Runtime Exceptions", 0)
End If
End Try
Return exSetting.BreakWhenThrown
End Function
'...
Ответ 5
Ну, я написал подключаемый модуль VS2008 С#, который переключает 386 исключений, и требуется около 1 секунды для переключения состояния. Я предполагаю, что из-за COM-взаимодействия.
Это было основано на коде VB/macro в одной из ваших ссылок. Я не мог найти более простой метод С++ (но не исключаю его).
Следующим уровнем будет создание подключаемого модуля с привязкой к клавиатуре, который затем откроет пользовательский интерфейс "Исключения" и затем "нажмет" правильное поле для вас.
Удачи.
Ответ 6
Вы можете использовать инструмент AutoHotKey для создания записанного script (щелчки мышью или нажатия клавиш), а затем назначить его горячая клавиша, которая будет воспроизводиться при нажатии...
Ответ 7
Просто предлагаю некоторую информацию, которую я нашел на этом (здесь), поскольку я чистил сеть в своей бесполезной попытке помочь...
Кто-то другой задал этот же вопрос, и на него ответил Гари Чанг из MS Support, здесь приведенный ответ:
Я боюсь, что код макроса не может манипулировать операциями на Исключения...
Важно отметить, что это сообщение с декабря 2005 года, поэтому этот ответ может быть более точным; в любом случае, подумал, что я выброшу его там.
Ответ 8
Предложение об установке специального ExceptionSetting для группы действительно переключает состояние флажка верхнего уровня. Однако, похоже, он не переключает отдельные исключения ниже этого в дереве, и, кроме того, мой процесс не останавливается, когда такие исключения выдаются так же, как если бы я вручную проверял флажок верхнего уровня. Вы видите другое поведение?
Ответ 9
Мой макрос, чтобы игнорировать текущее исключение CLR во время выполнения. Он работает как кнопка "отключить этот тип исключения", когда исключение появляется во время отладки.
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.ControlChars
' execute Macros.MyMacros.VSDebuggerExceptions.IgnoreCurrentExceptionWhenThrown from VS Command Window
Public Module VSDebuggerExceptions
Sub BreakWhenThrown(Optional ByVal strException As String = "")
Dim dbg As Debugger3 = DTE.Debugger
Dim eg As ExceptionSettings = _
dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
eg.SetBreakWhenThrown(True, eg.Item(strException))
End Sub
' copied from Utilities module (samples)
Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True) As OutputWindowPane
Dim window As Window
Dim outputWindow As OutputWindow
Dim outputWindowPane As OutputWindowPane
window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
If show Then window.Visible = True
outputWindow = window.Object
Try
outputWindowPane = outputWindow.OutputWindowPanes.Item(Name)
Catch e As System.Exception
outputWindowPane = outputWindow.OutputWindowPanes.Add(Name)
End Try
outputWindowPane.Activate()
Return outputWindowPane
End Function
Private WithEvents t As Timers.Timer
' Adds the current exception to ignore list
Sub IgnoreCurrentExceptionWhenThrown()
Dim commandWin As EnvDTE.CommandWindow
commandWin = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindCommandWindow).Object
Select Case DTE.Debugger.CurrentMode
Case dbgDebugMode.dbgDesignMode
commandWin.OutputString("This macro is not enabled in Design Mode. Run it in Break Mode." + vbCrLf)
Return
Case dbgDebugMode.dbgRunMode
commandWin.OutputString("This macro is not enabled in Run Mode. Run it in Break Mode." + vbCrLf)
Return
End Select
commandWin.OutputString(Environment.NewLine)
commandWin.OutputString("Trying to get the information about current exception.." + Environment.NewLine)
Dim dbg As Debugger3 = DTE.Debugger
Dim currentExpression As Expression = dbg.GetExpression("$exception", False)
Try
Dim currentExceptionTypeString As String = currentExpression.DataMembers.Item(1).Type
commandWin.OutputString("Detected current exception type is : " + currentExceptionTypeString + Environment.NewLine)
Dim flag As Boolean = True
Dim eg As ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
Try
eg.SetBreakWhenThrown(False, eg.Item(currentExceptionTypeString))
Catch exc As Exception
commandWin.OutputString("Cannot find this exception, trying to create.." + currentExceptionTypeString + Environment.NewLine)
'
eg.NewException(currentExceptionTypeString, New Random().Next)
eg.SetBreakWhenThrown(False, eg.Item(currentExceptionTypeString))
eg.SetBreakWhenUserUnhandled(True, eg.Item(currentExceptionTypeString))
flag = False
End Try
commandWin.OutputString(Environment.NewLine)
commandWin.OutputString("Exception '" + currentExceptionTypeString + "' added to ignore list.")
commandWin.OutputString(Environment.NewLine)
t = New Timers.Timer()
' small interval to send keys after DTE will start to exec command
t.Interval = 0.1
t.Start()
DTE.ExecuteCommand("Debug.Exceptions")
Catch exc As Exception
commandWin.OutputString("Error occured")
End Try
End Sub
Private Sub t_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles t.Elapsed
t.Stop()
' only press Ok to apply changed exceptions settings to debugger
System.Windows.Forms.SendKeys.SendWait("%t")
System.Windows.Forms.SendKeys.SendWait("{ENTER}")
End Sub
End Module
Ответ 10
CTRL + ALT + E
ALT + T
Введите
работает для меня