2011-06-13 10 views
6

Poszukuję sposobu blokowania debugera Visual Studio, aby przejść do niektórych klas i funkcji po naciśnięciu klawisza F11. Lub zablokuj niektóre pliki, aby IDE ich nie otwierało, tylko krok po kroku (z wyjątkiem sytuacji, gdy jest wyjątek).Blokowanie debuggera, aby przejść do funkcji

Wiem, brzmi to głupie, ale używam inteligentne kursory i innych klas pomocniczych, wiele przeciążonych operatorów, proste wyrażenie składa się z wielu wywołań funkcji, które znikają na optymalizacji, więc nie jest to kwestia prędkości, ale jest to problem debugowania, otwierania i zamykania wielu plików przez cały czas, przechodzenia przez wiele funkcji, przypadkowego opuszczenia kodu docelowego i tak dalej.

Oto przykład, co ja mówię:

stepToThisFunction(objectOfIgnoreClass->ignoreFunction()); 

Gdy debugger na tej linii, wciśnięcie F11 powinno wejść tylko stepToThisFunction, krocząc przez ignoreFunction() ewentualnie dowolnego wywołania funkcji z objectOfIgnoreClass.

Niektóre natywne odpowiedniki zarządzanego DebuggerStepThrough. Nie chcę używać CLI. Tylko słowo kluczowe lub makro zapisane przed funkcją/klasą. Znalazłem także coś, niektóre modyfikacje klucza rejestru, ale to nie wydaje się być tym, czego szukam, lub nie rozumiem tego mechanizmu (nie rozumiem nawet, jakie klucze rejestru mają do tego wspólnego) . Również "wstaw punkt przerwania" i "biegnij do kursora" nie są akceptowanym rozwiązaniem.

Odpowiedz

6

Mam makro do zrobienia właśnie tego. Nie jest bardzo szybki, ale jest bardzo przydatny (w rzeczywistości przekonwertowałem go również na język C#, dzięki czemu mogę go używać w AddIn, który jest znacznie szybszy). Wystarczy dostosować regexp z funkcjami chcesz zignorować i wiążą się z F11 lub innej tonacji swojego wyboru:

Sub StepIntoNextRealFunction() 
    DTE.Debugger.StepInto(True) 
    Dim frame As EnvDTE.StackFrame = DTE.Debugger.CurrentStackFrame 
    Dim fn As String = frame.FunctionName 
    Dim skipRE As Regex = New Regex("operator.*->|MyString::MyString|operator new|operator.*\*|ignoreFunction") 
    If (skipRE.Match(fn).Success) Then 

     DTE.Debugger.StepOut(True) 
     DTE.Debugger.StepInto(True) 
    End If 
End Sub 

Edycja: tutaj jest wersja C# - musisz utworzyć Addin a następnie podłączyć się do DTE obiektu:

public void StepIntoNextRealFunction(DTE2 dte) 
    { 
     Debugger2 debugger=(Debugger2)dte.Debugger; 
     debugger.StepInto(true); 
     while (true) { 
      EnvDTE.StackFrame frame = debugger.CurrentStackFrame; 
      string fn = frame.FunctionName; 
      Regex skipRE = new Regex("operator.*->|basic_string.*basic_string"); 

      if ((skipRE.Match(fn).Success)) { 
       debugger.StepOut(true); 
       debugger.StepInto(true); 
      } else { 
       break; 
      } 
     } 
    } 
+0

+1 Bardzo przebiegły! – RichieHindle

+0

@SististraD: Otwórz Eksplorator makr, utwórz nowy moduł, jeśli jeszcze go nie masz i wklej tam tę funkcję, a następnie w Narzędzia -> Opcje -> Klawiatura możesz zamapować skrót klawiaturowy. Spójrz również na niektóre z przykładowych makr - jest tam kilka naprawdę użytecznych rzeczy. –

+0

Tymczasem znalazłem go w MSDN (usunięto mój komentarz, nie widziałem twojej odpowiedzi). Będę musiał przepisać to na C#, ponieważ nie mam zainstalowanego VB.NET. Czy masz wersję C# (jak wspomniałeś w swoim wpisie, czy próbowałeś powiedzieć .NET)? Nie stanowi problemu, jeśli nie. Mówię w C#, więc myślę, że sobie poradzę. – SinistraD

3

Kliknij prawym przyciskiem myszy na wierszu i wybierz "Krok w specyficzne". Następnie wybierz żądaną funkcję.

+0

To naprawdę działa, ale to nie jest intuicyjny, co musisz zrobić, to za każdym razem, nie jest nieco bardziej trwałe rozwiązanie? Jak makro lub coś w rodzaju – SinistraD

Powiązane problemy