Как отладить в исходный код .NET Framework

3

Как можно отладить исходный код .NET Framework с помощью Visual Studio 2017?

Здесь есть несколько вопросов на stackoverflow по этой теме, но даже после прочтения всех из них, я все еще не смог заставить его работать. Я подумал, что было бы полезно представить современное, работающее решение о том, как отлаживать исходный код .NET Framework.

Я хотел бы решить это без использования каких-либо внешних инструментов (например, dotPeek в качестве исходного сервера).

Теги:
debugging

2 ответа

7
Лучший ответ

Прежде всего, я протестировал его с помощью Microsoft Visual Studio Enterprise 2017 версии 15.9.7 и .NET Framework 4.7.2. Тем не менее, я думаю, что он должен работать в редакции сообщества так же.

Шаги, чтобы принять:

  1. Перейдите в Инструменты/Параметры/Отладка/Общие и выполните следующие настройки:

    • установите флажок Включить пошаговое выполнение исходного кода .NET Framework (это автоматически отключит "Включить только мой код"; если нет, сделайте это вручную)
    • снимите флажок Требовать, чтобы исходные файлы точно соответствовали исходной версии
    • установите флажок Включить поддержку исходного сервера
  2. Перейдите в Инструменты/Параметры/Отладка/Символы и:

    • в верхнем списке отметьте серверы Microsoft Symbol
    • нажмите кнопку Очистить кэш символов (чтобы убедиться, что вы получите правильные символы)
    • установите флажок " Загрузить все модули, если не исключено" внизу
  3. Загрузите источник версии платформы .NET, на которую нацелен ваш проект, с сайта https://referencesource.microsoft.com/download.html.

  4. Распакуйте загруженный архивный (zip) файл по удобному пути на вашем ПК.

  5. Отладить ваше приложение; установите точку останова для строки кода .NET, которую вы хотите отлаживать, и перейдите к нужной строке кода с помощью отладчика.

Примечание: ваше приложение может запуститься медленнее, поскольку оно будет загружать PDB из Интернета.

  1. Нажмите Step Into (по умолчанию F11). Если ваши настройки верны, это приведет к некоторой задержке (если ваш VS выйдет из строя (как у меня), снова очистите кэш символов). В конце концов он запросит источники данного файла, например dictionary.cs. Здесь могут произойти две вещи:

    • A) Он запрашивает исходный файл (.cs) в диалоговом окне файла. Переходите к шагу 7.
    • B) Там написано, whatever.cs не найден, и есть ссылка " Browse and find what.cs... ". Нажмите на эту ссылку.
  2. Выберите соответствующий файл .cs на вашем диске (вы можете найти файл в ОС).

Примечание: мне приходилось перезагружать VS несколько раз, пока он не "зависал" при поиске источников, это скорее всего ошибка в VS.

  1. Если вы все сделали правильно, вы обнаружите, что отлаживаете исходный код .NET.

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

  • 0
    Одна странная вещь - это работает для меня только при отладке кода из mscorlib.dll , но не из, например, System.Core.dll . Кто-нибудь знает решение для этого?
0

Многие люди задаются вопросом, почему они не могут войти в источник, хотя они устанавливают флажки, как описано выше. Я тоже.

Поскольку вы можете извлекать источники dotnet в любое место, Visual Studio не может узнать о них, и причина не может быть в самих исходных файлах (почему Visual Studio не находит эти файлы).

Но некоторые dll доступны для просмотра, некоторые нет (через двойной щелчок в представлении стека Visual Studios или в контекстном меню> перейти к исходному тексту). Это привело меня к предположению, что причиной является сама .pdb. Если вы посмотрите на файл, который работает (например, блокнот), вы увидите в начале список строк с файловыми путями (исходные файлы). В файлах, которые не работают, файлы начинаются сразу же с двоичных данных.

По какой-то причине Microsoft не создает свой .pdb с полной отладочной информацией в каждом процессе сборки. Но почему бы и нет - хороший вопрос! г

Короче говоря: вам нужно искать версию вашего файла в dll (которую вы хотите отлаживать), которая содержит полную информацию отладки. Это также причина, почему контекстное меню отключает "Goto Source". Я заменяю этот файл временным в глобальном кэше сборок на время отладки. Это работает для меня.

Вот пример PresentationFramework.dll - 4.0.30319.298 => размер pdb: 1219 КБ - 4.0.30319.18408 => размер pdb: 15,562 КБ

Perhabs кто-нибудь может создать публичную базу данных (вики), в которую каждый может добавлять файлы и версии, для которых доступна полная отладочная информация?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню