Перемещение по методу без символов - Как вступить?

Использование Visual Studio 2008 SP1 и проекта VB.NET; У меня есть код, на который я не могу войти. В окне Immediate отображается сообщение "Переход по методу без символов" Some.Namespace.Here "

Как я могу убедиться, что метод всегда имеет символы?! Мне нужно войти в каждую строку кода. Я нажимаю F8 (который является "Step Into" в VS2008, из памяти я думаю, что он был F11 в VS2005).

Этот материал отладчика всегда меня смутил: На страницах свойств уровня Solution я вижу раскрывающийся список конфигурации с 4 значениями: активным (отладочным), отладочным, выпуском, всеми конфигурациями. - в настоящее время установлено значение "Active (Debug)" На уровне проекта я вижу раскрывающийся список конфигурации с двумя значениями: Отладка, выпуск. - в настоящее время установлено значение "Отладка"

Ответ 1

Я знаю, что это старый вопрос, но возможно ли вы используете функциональность yield в методе, который возвращает IEnumerable?

Например (изобретенный):

public IEnumerable<object> GetObjects(IEnumerable<object> objects)
{
    foreach(var obj in objects)
        yield return obj;
}

Я часто сталкиваюсь с этим в своих модульных тестах, но из-за ленивой оценки операторы yield не обрабатываются до тех пор, пока это не будет необходимо. Один из способов принудительного перечисления состоит в том, чтобы привязать .ToList() к вызывающему оператору, например, хотя вы не захотите делать это навсегда, если только вызов не является испытанием для некоторых функций, где сам перечисление не имеет значения.

Таким образом, следующее перечисление должно приводить к перечислению:

GetObjects(new List<object>()).ToList();

Короче говоря, если вы вызываете метод, требующий перечисления, но затем никогда не перечисляете результат, вы получите эту ошибку в выходе. Это может случиться и с операциями LINQ, например .Select.

Изменить: не заметил, что это проект VB.NET, но я уверен, что принцип все еще стоит.

Ответ 2

В Visual Studio 2010 я столкнулся с одной и той же проблемой. Я попытался бы перейти на источник .NET Framework, Visual Studio перешагнет через него, в окне вывода будет указано, что он не может войти в него, потому что файл символа wasn 't загружен, но когда я посмотрел окно модулей, я увидел бы, что фактически был загружен соответствующий файл символов.

Проблема заключалась в том, что файл символов .NET был загружен, но он не был символьным файлом .NET с включенной исходной информацией. Сервер общедоступных символов Microsoft в http://referencesource.microsoft.com/symbols содержит символы с включенной исходной информацией. Сервер общедоступных символов Microsoft в http://msdl.microsoft.com/download/symbols содержит символы без исходной информации.

Одно из решений - правильно установить _NT_SYMBOL_PATH так, чтобы он захватывал символы .NET Framework из http://referencesource.microsoft.com/symbols, если они существуют, и из http://msdl.microsoft.com/download/symbols в противном случае. Что-то вроде этого будет работать:

_NT_SYMBOL_PATH = SRV * d:\SymbolsCache * HTTP://referencesource.microsoft.com/symbols; СРВ * d:\SymbolsCache * HTTP://msdl.microsoft.com/download/symbols

Этот _NT_SYMBOL_PATH заставит отладчика сначала искать символы с исходной информацией, а затем, если их нет, он получит символы без него. Когда Visual Studio имеет файл символа с исходной информацией, он может войти в этот код.

Ответ 3

Если рассматриваемое пространство имен является третьей стороной dll, которая не содержит символы (файл pdb), это произойдет. Чтобы "вступить", необходим файл символа.

Если это ваш собственный код, вам просто нужно дважды проверить, существуют ли ваши файлы символов. Если он настроен на отладку на уровне проекта, он должен это сделать.