2010-12-30 13 views
8

最近、Visual Studio 2010デバッガが[DebuggerStepThrough]属性でマークされたこのメソッドにジャンプしていることに気付きました。DebuggerStepThroughが無視される

Visual Studio 2010 stepping into a DebuggerStepThrough area

コールスタックは次のようになります。

  1. Page.OnLoadは[DebuggerStepThrough]としてマークされたクラスにメソッドIsSubclassOfGenericを呼び出します。示すよう
  2. IsSubclassOfGenericSystem.Linq.Enumerable.Any拡張にラムダ式を渡し、GetHierarchyを呼び出します。
  3. Visual Studioは、上記のようにメソッドにステップインします。

私は無駄に、以下のようにforeachループでLINQの呼び出しを交換した。この方法は、かなり頻繁に呼び出されるので、これは、迷惑のビットである

Call to GetHierarchy

をし、なぜ属性が無視されているのか分かりません。

答えて

3

この単純なコンソールアプリケーションを試し、示された行にブレークポイントを置き、デバッガを実行し、最初のブレークポイントで(F11)を押します。それは2番目のブレークポイントを欠場するはずです。それ以外の場合は、ビジュアルスタジオの設定/拡張機能が混乱するかもしれません。

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は、実際に私はそれがyield文とは何かを持っていると思います。リスト(GetHierarchy2)をビルドしようとすると、DebuggerStepThrough属性に問題はありません

+0

それは確かにそのように見えます。私はこれに気づいていないと率直に驚いています。 IEnumerable/IEnumeratorクラスを明示的に実装するだけですが、少し面倒ですが、全体的に価値があるかもしれません。 –

0

リリースモードバイナリをデバッグしていますか?それはコンパイル時に最適化され、おそらくコンパイラにとって決定的になるかもしれないので、ステップインすることはできません。生成されたILを見て、これが当てはまるかどうかを見てください。

+1

問題は、それが欲しくないときにステップインしてしまうことです。私はコードの他の側面に焦点を当てようとしています。 –

関連する問題