Переключатель «Перерыв при возникновении исключения». используя макрос или сочетание клавиш - PullRequest
42 голосов
/ 06 июня 2009

Редактировать: новое окно исключений Visual Studio 2015 намного быстрее, чем старый диалог, который меня больше не интересует с помощью клавиатуры ярлык для него.

Есть ли макрос или сочетание клавиш, которое будет переключать «разрыв при возникновении исключения» без использования графического интерфейса?

Открытие диалогового окна с помощью ctrl + alt + e и установка флажка «Исключения во время выполнения общего языка», после чего нажатие кнопки «ОК» достаточно простое, но я очень часто этим занимаюсь. Для этого я бы предпочел комбинацию клавиш.

Этот вопрос является дубликатом У кого-нибудь есть ярлык / макрос Visual Studio для переключения на обработанные / необработанные исключения?

Однако автор принял ответ, который на самом деле не работает, и мне бы очень хотелось получить ответ, который работает .

Ответ в дублирующем вопросе неприемлем, поскольку он включает только одно конкретное исключение, а не всю группу CLR.

«Хорошо, тогда напиши цикл». ты говоришь. Но не так быстро! Кто-то уже пробовал это , и это было бесполезно медленно. (Да, я проверил, что это медленно в моей системе.)

Таким образом, задача состоит в том, чтобы использовать макрос для переключения всей категории исключений CLR менее чем за 1 или 2 секунды. Этот вопрос является дубликатом У кого-нибудь есть ярлык / макрос Visual Studio для переключения на обработанные / необработанные исключения?

Ответы [ 10 ]

18 голосов
/ 11 июня 2009

Очень похоже на другой ответ, но для группы есть специальный 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
13 голосов
/ 01 апреля 2013

Я создал бесплатное расширение Visual Studio, которое может делать это надежно: Exception Breaker .
Он использует недокументированный IDebugSession2.SetException вызов, который очень быстрый: все исключения устанавливаются / сбрасываются в течение 20–60 миллисекунд.

4 голосов
/ 20 апреля 2010

Вот очень полезный макрос Брайса Кейла, слепо обновленный для запуска в 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
2 голосов
/ 26 октября 2011

Сначала я инициализировал таймер, а затем вызываю команду 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

'...
1 голос
/ 12 августа 2013

CTRL + ALT + E ALT + T Введите

у меня работает

1 голос
/ 25 января 2012

Мой макрос для игнорирования текущего исключения 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
1 голос
/ 16 октября 2009

Предложение установки специального ExceptionSetting для группы действительно переключает состояние флажка верхнего уровня. Тем не менее, кажется, что он не переключает отдельные исключения под ним в дереве, и, кроме того, мой процесс не останавливается при возникновении таких исключений, как если бы я вручную установил флажок верхнего уровня. Вы видите другое поведение?

1 голос
/ 17 июня 2009

Просто предлагая некоторую информацию, которую я нашел на этом ( здесь ), когда я обыскивал сеть в своей тщетной попытке помочь ...

Кто-то еще задал этот же вопрос, и на него ответил Гэри Чанг из службы поддержки MS, вот цитата:

Боюсь, код макроса не может манипулировать операциями на Диалоговое окно исключений ...

Важно отметить, что эта публикация относится к декабрю 2005 года, поэтому этот ответ может быть неточным; в любом случае, думал, что я выброшу это там.

1 голос
/ 17 июня 2009

Вы можете использовать такой инструмент, как AutoHotKey , чтобы создать записанный сценарий (щелчки мыши или нажатия клавиш), а затем назначить ему горячую клавишу, которая будет воспроизводить его при нажатии ...

1 голос
/ 11 июня 2009

Ну, я написал плагин на основе VS2008 C #, который переключает 386 исключений, и это занимает около 1 секунды на переключение состояний. Я предполагаю, что это из-за COM-взаимодействия.

Это основано на коде VB / макроса в одной из ваших ссылок. Я не смог найти более простой метод C ++ (но не исключил его).

Следующим уровнем будет создание плагина с привязкой к клавиатуре, который затем открывает интерфейс исключений и затем «щелкает» нужную галочку для вас.

Удачи.

...