Отладка метода IEnumerable

У меня есть метод с возвратами IEnumerable<T> и я пытаюсь отладить код в том методе.

Каждый раз, когда я ступаю через код в Visual Studio во время отладки, это переступает через рассматриваемый метод.

Когда я помещаю точку останова в методе, он никогда не поражается. Код определенно работает, поскольку я протестировал yield return'луг фальсифицирует T из метода.

Разве это не возможно отладить методы IEnumerable этот путь или, я делаю что-то еще неправильно?

24
задан Jamie Dixon 12 January 2010 в 14:55
поделиться

2 ответа

1) Как я могу определить, какой источник этих 27 таймеров?

Попробуйте найти экземпляры Timercallback (для Threading.timer):

!dumpheap -type TimerCallback

затем выбросить свойства обратного вызова (где Адрес обратного вызова - «Адрес» из выхода DUAMPHEAP):

!do <callback address>

Затем выбросить значение Адрес _Target :

!do <_target address>

, который должен высказывать объект, который содержит Ссылка на TimerCallback, которая должна привести вас к тому, где был создан таймер.

Рекомендую проверить TESS FERRANDEZ's отладки лаборатории , если вы еще этого не сделали.

2) Что означает 13 мертвых потоков?

Мое понимание состоит в том, что мертвая тема относится к потоке C ++, которая больше не имеет активной резьбы ОС, но все же имеет ссылки и, следовательно, не могут быть уничтожены (резьбы C ++ используют Ref подсчет).

Нить C # содержит ссылку на резьбу C ++, и если ваш управляемый код хранит ссылку на резьбу C #, то это может быть ваша проблема.

Этот пост на блоге Юнь Джина может оказаться некоторым интересам для вас.

3) Один из моих потоков помечается как блокировка. Если я переключаюсь на эту нить и запустите! CLRSTACK, я вижу следующее - это связано с моими таймерами?

, который выглядит как нить таймера (System.threading), ожидающий его интервала для пробка.

-121--2708710-
public List<File> getFilesInJar(String jarName){    
  List<File> result = new ArrayList<File>();
  File jarFile = new File(jarName);    
  JarInputStream jarFile = new JarInputStream(new FileInputStream(jarFile));
  JarEntry jarEntry;

  while ((jarEntry = jarFile.getNextJarEntry()) != null) {
    result.add(inputStreamToFile(jarFile.getInputStream(jarEntry)));
  }
  return result;
}

Для метода ввода ввода, Google «java plactStream к файлу», хотя вы можете быть довольны объектом INPUTSTREAM также, вместо файлового объекта :)

-121--2975530-

Этот метод становится только ударом только при использовании элементов в IENumerable. Помните, что IEUmerable Lazy загружает предметы, так что только потому, что вы вызываете метод, который возвращает IEnumerable, не означает, что метод на самом деле вызывается в этой точке. Если вы хотите, чтобы он попал вправо, когда вы это называете, добавьте Tolist () в конце вашего метода Call:

var result = myEnumerableMethod().ToList();
51
ответ дан 28 November 2019 в 23:10
поделиться

Не должно быть проблемой для отладки реализации Ienumerable ... Может быть, вы просто используете неправильный .dll (если вы перечислитете в внешней библиотеке) ...

Вы можете попробовать простую тестовую консоль, и перейти отсюда

class Program
{
    static void Main(string[] args)
    {
        foreach (String foo in new Foo())
        {
            Console.WriteLine(foo);
        }
    }
}

class Foo : IEnumerable<String>
{
    #region IEnumerable<string> Members

    public IEnumerator<string> GetEnumerator()
    {
        yield return "fake # 1";
        yield return "fake # 2";
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    #endregion
}
0
ответ дан 28 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: