DebuggerStepThrough被忽略

时间:2010-12-30 00:19:02

标签: visual-studio-2010 debugging

我最近注意到Visual Studio 2010调试器不断跳转到标有[DebuggerStepThrough]属性的方法。

Visual Studio 2010 stepping into a DebuggerStepThrough area

callstack看起来像这样:

  1. Page.OnLoad在标记为[DebuggerStepThrough]的类中调用方法 IsSubclassOfGeneric
  2. IsSubclassOfGeneric 调用 GetHierarchy ,如图所示,将lambda表达式传递给 System.Linq.Enumerable.Any 扩展名。
  3. Visual Studio将进入如上所示的方法。
  4. 我刚刚用foreach循环替换了Linq调用,如下所示,无济于事:

    Call to GetHierarchy

    这有点令人烦恼,因为这个方法被频繁调用,我不明白为什么要忽略该属性。

2 个答案:

答案 0 :(得分:3)

尝试这个简单的控制台应用程序,在指示的行上放置断点,运行调试器并在第一个断点处按步骤(F11)。它应该错过第二个破发点。 Otherwsie如果可能是视觉工作室设置/扩展搞乱了。

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

修改

实际上我认为它与yield语句有关。如果我尝试构建一个列表(GetHierarchy2),我对DebuggerStepThrough属性没有任何问题

答案 1 :(得分:0)

您是否正在调试发布模式二进制文件?它可能是优化的,也许只是编译时编译器的确定性,所以你将无法介入。看看生成的IL,看看是否是这种情况。