2010-12-30 65 views
8

Son zamanlarda Visual Studio 2010 hata ayıklayıcısının [DebuggerStepThrough] özniteliğiyle işaretlenmiş bu yönteme atlamaya devam ettiğini fark ettim.DebuggerStepBu göz ardı ediliyor

Visual Studio 2010 stepping into a DebuggerStepThrough area

callstack şuna benzer:

  1. Page.OnLoad [DebuggerStepThrough] olarak işaretlenmiş bir sınıfta bir yöntem IsSubclassOfGeneric çağırır.
  2. IsSubclassOfGenericSystem.Linq.Enumerable.Any uzantısına lambda ifade geçen gösterildiği gibi GetHierarchyçağırır.
  3. Visual Studio, yukarıda gösterildiği gibi yönteme girer.

Sadece boşuna, aşağıda bir foreach döngüsü ile Linq çağrıyı yerini almıştır: Bu yöntem oldukça sık denir beri bu sıkıntı biraz,

Call to GetHierarchy

olduğunu ve Niteliğin neden göz ardı edildiğini anlamıyorum.

cevap

3

Bu basit konsol uygulamasını deneyin, belirtilen satırlara kesme noktaları koyun, hata ayıklayıcıyı çalıştırın ve ilk kesme noktasında (F11) adımına basın. İkinci mola noktasını kaçırmalı. Otherwsie, bir şeyler yapabilmeniz için bir görsel stüdyo ayarı/uzantısı olabilir.

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; 
     } 
    } 
} 

DÜZENLEME Aslında ben verim deyimi ile ilgisi olduğunu düşünüyorum. Bir liste (GetHierarchy2) oluşturmayı denerseniz, DebuggerStepThrough özniteliği

+0

Kesinlikle öyle görünüyor. Bunu daha önce fark etmediğime çok şaşırdım. İstediğim şeyi alabilmem için tek yolu, biraz rahatsızlık veren IEnumerable/IEnumerator sınıflarını açık bir şekilde uygulamaktır ama bütün bunlar buna değer olabilir. –

0

Bir serbest bırakma modu ikili mi hata ayıklanıyorsunuz? Derleme zamanında derleyici için optimize edilebilir ve belki de sadece deterministik olabilir. Bu sayede devreye giremezsiniz. Üretilen IL'ye bir göz atın ve durumun böyle olup olmadığını görün.

+1

ile ilgili bir sorunum yok Sorun, istemediğimde adım atmasıdır. Kodun diğer yönlerine odaklanmaya çalışıyorum ve bu şekilde devam ediyor. –

İlgili konular