Как отлаживать исходный код среды .NET 4.6 в Visual Studio 2017?

Вот что я пробовал:

Создано новое консольное приложение (.NET Framework) в Visual Studio 2017.

Добавлен следующий код:

static void Main(string[] args)
{
    new Dictionary<int, int>().TryGetValue(3, out int x); //I want to step into TryGetValue() (this is just an example)
}

Настроить параметры, перечисленные здесь: https://blogs.msdn.microsoft.com/sburke/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code/

Подтвержденные символы загружаются в окне "Модули":

mscorlib.dll Загруженные символы. 4.6.1586.0 построено: NETFXREL2

Пробовал: "Шаг в (F11)"

Пробовал: "Шаг в конкретный" | "System.Collections.Generic.Dictionary.TryGetValue"

Оба просто перешагивают через строку.

Я попытался настроить VS, используя здесь следующие данные: http://www.symbolsource.org/Public/Home/VisualStudio

Тот же результат, отладчик переходит по строке.

Я посмотрел ответ здесь: qaru.site/info/52815/...

Но эта версия, похоже, не является обновлением безопасности, а поиск "site: support.microsoft.com/kb 4.6.1586.0" ничего не дает.

Что я делаю неправильно?

Ответ 1

Вот ответ, благодаря Хансу Пассанту. Обратите внимание, что это решение вызывает дополнительные вопросы.

  • Убедитесь, что https://referencesource.microsoft.com/ содержит точную версию, которую вы отлаживаете.

    • Как? Справочный источник указывает ".NET Framework 4.6.2", но версия модуля выглядит примерно так: "4.6.1586.0"
    • Вам может потребоваться удалить обновления для системы безопасности, как описано здесь: Как включить "Включить .NET Framework source stepping" ?
  • Настройте Visual Studio, как указано здесь: https://referencesource.microsoft.com/setup.html

    • Отключить "Включить только мой код"
    • Отметьте "Включить исходный шаг .NET Framework" (это должен был быть единственный шаг)
    • Отметьте "Включить поддержку исходного сервера"
    • Untick "Требовать, чтобы исходные файлы соответствовали исходной версии"
  • Подтвердите, что символы загружаются в окне "Модули" с включенной индексацией источника.

    • Как вы можете определить, включена ли индексация индекса? Окно модулей не указывает, разделил ли PDB исходную информацию.

Microsoft может сделать этот процесс намного более надежным, предоставив полезные сообщения об ошибках вместо того, чтобы тихо проваливаться.

Ответ 2

Используйте функцию сервера символов в JetBrains dotPeek. После того, как я попытался заставить работать стандартную функциональность, мне это показалось очаровательным:

  1. Запустите dotPeek и перейдите в Инструменты> Параметры...> Сервер символов.
  2. Убедитесь, что выбран "Все сборки", и скопируйте URL-адрес локального сервера символов в буфер обмена. Запустите сервер символов dotPeek, щелкнув его в меню "Инструменты".
  3. В Visual Studio выберите Сервис> Параметры...> Отладка> Символы и добавьте URL-адрес сервера dotPeek в список. Переместите сервер символов dotPeek как можно выше вверх по списку и снимите все остальные серверы символов в списке (в частности, не должны быть выбраны "Серверы символов Microsoft" и "Сервер символов NuGet.org").
  4. Начните отладку - когда вы попытаетесь войти в исходный код Framework, вы увидите, что dotPeek выполняет некоторую работу по декомпиляции сборки для вас, и тогда вы попадете в ее исходный код.

Если это не сработает, возможно, потому что Visual Studio ранее загрузила "неправильные" символы для рассматриваемой сборки из Microsoft/NuGet и использует их вместо запроса dotPeek. Чтобы проверить это, начните отладку и найдите соответствующую сборку в списке модулей (Debug> Windows> Modules) - удалите файл PDB по пути, указанному в "Symbol File" для этой сборки, затем перезапустите отладку, и dotPeek должен начать работу,