2010-12-30 15 views
8

Ostatnio zauważyłem, że debuger Visual Studio 2010 wciąż przeskakuje do tej metody, która jest oznaczona atrybutem [DebuggerStepThrough].Tryb debugowania Przez ignorowanie

Visual Studio 2010 stepping into a DebuggerStepThrough area

callstack wygląda mniej więcej tak:

  1. Page.OnLoad wywołuje metodę IsSubclassOfGeneric w klasie oznaczonej jako [DebuggerStepThrough].
  2. IsSubclassOfGeneric wzywa GetHierarchy jak pokazano, przechodząc wyrażenia lambda do System.Linq.Enumerable.Any przedłużenia.
  3. Visual Studio wprowadza kroki do metody, jak pokazano powyżej.

właśnie otrzymuje wezwanie Linq z pętlą foreach jak poniżej, bezskutecznie:

Call to GetHierarchy

To jest trochę kłopotliwe, gdyż ta metoda nazywa się dość często, a Nie rozumiem, dlaczego atrybut jest ignorowany.

Odpowiedz

3

Wypróbuj tę prostą aplikację konsolową, umieść punkty przerwania na wskazanych liniach, uruchom debugger i na pierwszym punkcie przerwania, naciśnij klawisz przejścia do (F11). Powinien przegapić drugi punkt przełomowy. Otherwsie, jeśli może być ustawieniem/rozszerzeniem studia visual.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 

namespace tmp { 
    class Program { 
     static void Main(string[] args) { 
      IEnumerable<Type> types = typeof(System.IO.IOException).GetHierarchy(typeof(System.Exception)); //break point here 
      int i = 0; 
     } 
    } 
    static class Ext { 
     //[DebuggerStepThrough] 
     //[DebuggerNonUserCode] 
     //[DebuggerStepperBoundary] 
     public static IEnumerable<Type> GetHierarchy(this Type type, Type limit) { 
      if (type == null) { //break point here 
       throw new Exception(); 
      } 
      do { 
       yield return type; 
       if (type == limit) { 
        yield break; 
       } 
      } while ((type = type.BaseType) != null); 
     } 

     [DebuggerStepThrough] 
     public static IEnumerable<Type> GetHierarchy2(this Type type, Type limit) { 
      if (type == null) { //break point here 
       throw new Exception(); 
      } 
      IList<Type> types = new List<Type>(); 
      do { 
       types.Add(type); 
       if (type == limit) { 
        break; 
       } 
      } while ((type = type.BaseType) != null); 
      return types; 
     } 
    } 
} 

EDIT

Właściwie myślę, że to ma coś wspólnego ze stwierdzeniem dochodowości. Jeśli próbuję budować listę (GetHierarchy2), nie mam problemu z atrybutem DebuggerStepThrough.

+0

To na pewno wygląda tak. Jestem zaskoczony, że nie zauważyłem tego wcześniej. Wydaje mi się, że jedynym sposobem, w jaki mogę uzyskać to, czego chcę, jest jawne zaimplementowanie klas IEnumerable/IEnumerator, co jest trochę irytujące, ale ogólnie może być tego warte. –

0

Czy debugujesz plik binarny w trybie zwolnienia? Może być zoptymalizowany i może być tylko deterministyczny dla kompilatora w czasie kompilacji, więc nie będziesz mógł wejść. Przyjrzyj się wygenerowanej IL i sprawdź, czy tak jest.

+1

Problem polega na tym, że pojawia się, gdy nie chcę tego. Próbuję skupić się na innych aspektach kodu, a to przeszkadza. –

Powiązane problemy