تبديل "كسر عند إلقاء استثناء". باستخدام اختصار ماكرو أو لوحة المفاتيح

StackOverflow https://stackoverflow.com/questions/958011

سؤال

تحرير: نافذة الاستثناء الجديدة في Visual Studio 2015 أسرع بكثير من مربع الحوار القديم الذي لم أكن أهتم بنفس القدر باستخدام اختصار لوحة المفاتيح له.

هل يوجد اختصار ماكرو أو لوحة مفاتيح يقوم بتبديل "كسر عند إلقاء استثناء" دون استخدام واجهة المستخدم الرسومية؟

فتح مربع الحوار مع CTRL + ALT + E والتحقق من مربع "استثناءات وقت تشغيل اللغة المشتركة" ثم النقر فوق "موافق" بسيط بما فيه الكفاية، ولكن هذا شيء أقوم به كثيرا. أفضل أن يكون لديك اختصار لوحة المفاتيح لهذا.

هذا السؤال هو نسخة مكررةأي إجراء اختصار / ماكرو بصرية للاستوديو لتبديل الاستثناءات المعالجة / غير المعالجة؟

ومع ذلك، قبل الملصق إجابة لا تعمل حقا، وأود حقا الإجابة التي هل الشغل.

الجواب في السؤال المكرر غير مقبول لأنه تبديل استثناء واحد فقط، وليس مجموعة CLR بأكملها.

"بكتابة بحلقة بعد ذلك." قول انت. ولكن ليس بسرعة كبيرة! حاول شخص ما بالفعل وكان بطيئا بلا مساعدة. (نعم لقد تحققت من أن بطيئا في نظامي أيضا.)

لذلك التحدي هو استخدام ماكرو لتبديل فئة استثناءات CLR بأكملها في أقل من ثانية واحدة أو 2 ثانية. هذا السؤال هو نسخة مكررةأي إجراء اختصار / ماكرو بصرية للاستوديو لتبديل الاستثناءات المعالجة / غير المعالجة؟

هل كانت مفيدة؟

المحلول

لقد قمت بإنشاء ملحق Visual Studio مجاني يمكن أن يفعل ذلك بشكل موثوق: كسر استثناء.
يستخدم غير موثق IDebugSession2.SetException استدعاء هذا سريع جدا: يتم تعيين جميع الاستثناءات / غير المؤسسة في 20 إلى 60 مللي ثانية.

نصائح أخرى

مشابه جدا للإجابة الأخرى، ولكن هناك استثناء خاص للمجموعة.

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

هنا محمولة برايس كاهلي مفيدة للغاية بشكل أعمى لتشغيلها في 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

أولا، قمت بتسهيل مؤقت، ثم استدعاء الأمر Exception.debug. ضرب الموقت، عند إتاحة مربع حوار المشرف. إذا كنت تستخدم Win 7 مع Senskeys UAC المعطلة مع مفتاح 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

'...

حسنا، لقد كتبت المكون الإضافي المستند إلى VS2008 C # تبديل استثناءات 386، ويستغرق تبديل حوالي ثانية واحدة لكل دولة. أنا أفترض أن هذا بسبب com inter-op.

كان هذا يعتمد على رمز VB / ماكرو في أحد الروابط الخاصة بك. لم أستطع العثور على طريقة C ++ أسهل (ولكن لا يحكمها).

سيكون المستوى التالي هو جعل مكون إضافي يحتوي على ملزمة لوحة مفاتيح، ثم يفتح استثناءات UI ثم "النقر فوق" مربع التجزئة الصحيحة لك.

حظ سعيد.

يمكنك استخدام أداة مثل autohotkey. لإنشاء برنامج نصي مسجل (نقرات الماوس أو مكابس المفاتيح) ثم قم بتعيينه على مفتاح الاختيار الذي سيعوده عند الضغط عليه ...

فقط تقديم بعض المعلومات التي وجدتها في هذا (هنا) كما كنت تجوب الشبكة في محاولتي غير المجدية للمساعدة ...

لقد طرح شخص آخر هذا السؤال نفسه وتم استجابةه من قبل Gary Chang من دعم MS، وإليك الاستجابة المقتبسة:

أخشى أن لا يمكن لمعرفة الكائنات الماكرو معالجة العمليات في مربع الحوار استثناءات ...

من المهم أن نلاحظ أن هذا النشر هو من ديسمبر عام 2005 حتى لا تكون هذه الاستجابة دقيقة؛ في كلتا الحالتين، اعتقدت أنني سوف رميها هناك.

إن اقتراح تعيين استثناءات خاصة للمجموعة يقوم بالفعل بتبديل حالة مربع الاختيار المستوى الأعلى. ومع ذلك، لا يبدو أن هذا لا يبدو أن الاستثناءات الفردية تحتها في الشجرة، وعلاوة على ذلك، فإن عمليةتي لا تتوقف عند إلقاء هذه الاستثناءات كما لو كنت تحقق يدويا من مربع الاختيار المستوى الأعلى. هل ترى سلوكا مختلفا؟

ماكرو لتجاهل استثناء 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

CTRL + ALT + E Alt + T أدخل

تناسبني

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top