Monday, June 30, 2014

Как отлаживать .NET Framework Source

В этой статье мы поговорим о том, как можно дебажить сами библиотеки .NET Framework в своих программах. Возможно бывали случаи, когда вам было интересно как работает внутри StringBuilder, или как построен класс Task, что происходит внутри библиотек, которые идут в поставке и которые мы добавляем, как ссылки в свой проект, воспринимая это как должное и не зная, как это работает изнутри. 
Недавно во время разговора с коллегами мы затронули тот факт, что процесс отладки самих библиотек описан Microsoft ("How to: Debug .NETFramework Source"), но с ним могут возникнуть сложности. Но поскольку недавно компания Microsoft анонсировала исходники .NET Framework 4.5.1 (referencesource.microsoft.com), процесс отладки стает еще более простым. Ниже представлен скриншот того, что собой представляет тот или иной класс без запуска среды программирования.
Давайте пошагово пройдемся по варианту, который идет в MSDN, а затем воспользуемся новыми возможностями отладки, используя referencesource.microsoft.com. Первым делом запустим нашу среду разработки Visual Studio (у меня это Visual Studio 2013) и откроем меню Tools->Options.
Затем перейдем в категорию Debugging.
Как видите, у меня для простоты работает поиск. Если у вас более старая версия студии поиска у вас может не быть. Затем переходим в пункт меню General и ставим галочку на Enable .NET Framework source stepping.
После этого выскочит окно предупреждения, просто нажмите дважды на кнопку OK. После этого переходим в категорию Symbols.
Затем изменяем путь в Cache symbols in this directory.
Если вы хотите загрузить сразу все .pdb файлы, можете поставить галочку Microsoft Symbol Servers и нажать на кнопку Load all symbols, которая на предыдущем рисунке неактивна. Давайте проверим, что у нас из этого получилось. Для этого создадим новое консольное приложение и назовем его DebuggingSourceSample.
У вас при запуске приложения произойдет загрузка ваших .pdb-файлов.
Затем напишем простенький пример, который будет использовать для теста.
class Program
{
    static void Main(string[] args)
    {
        var xml = XElement.Parse(@"<Author>John</Author>");
        var a = xml.ToString();
        Console.ReadLine();
    }
}
При первом запуски необходимые для отладки файлы будут подгружены автоматически в проект.
Давайте запустим наш проект и посмотрим, что из этого получилось. Для того чтобы перейти непосредственно в сам метод, нам нужно воспользоваться клавишей F11. 
Затем снова нажимаем на F11.
И мы уже внутри метода. Неплохо, не правда ли? Еще раз нажимаем на клавишу F11.
Погружаемся глубже и глубже, и так далее до конца метода, либо до того момента, до которого нам нужно. Теперь несколько нюансов, рекомендуемых для отладки .NET Framework в Visual Studio 2013. Если у вас не 2013 студия, вы можете пропустить данный пункт. Во-первых, сами настройки дебаггера должны иметь следующий вид:
Для Debugging->Symbols добавим новый путь referencesource.
Теперь небольшой бонус, который я подсмотрел в блоге Скотта Хансельмана в статье ".NETFramework Library Source Code available for viewing" и "Announcing the new Roslyn-powered .NET Framework Reference Source". Не всё, к сожалению, можно дебажить с помощью pdb-файлов. Например, такие части кода, как работа со списком, со StringBuilder, не позволят нам посмотреть, как это работает. Но благодаря возможностям, которые нам предоставляет Roslyn, мы можем понять код, который мы вызываем. Например, в таком коде у нас не сработает навигация на F11, и мы не сможем посмотреть, что происходит внутри.
static void Main(string[] args)
{
    var sb = new StringBuilder("Hello World");
    var a = sb.ToString();
    Console.ReadLine();
}
Но мы можем посмотреть, как построена логика по ссылке http://referencesource.microsoft.com/.
Но можно скачать расширение для Visual Studio Ref12, которое будет делать эту навигацию вместо нас, используя для этого горячую клавишу F12.
Если мы посмотрим в правую сторону окна браузера, то мы можем увидеть такие кнопки:
Document Outline

Project Explorer

Namespace Explorer


Функция Document Outline позволяет просмотреть список типов и методов в файле.
Функция Project Explorer позволяет просмотреть отображение в виде дерева файлов в текущем проекте / сборке. Ссылки и список папок, в зависимости сборки (недоступно для mscorlib):
И, наконец, Namespace Explorer показывает пространство имен и типы в текущем проекте / сборке. 
Кстати, вы можете использовать в offline режиме. Для этого вам придётся закачать исходники .NET Framework 4.5.1, которые доступны по ссылке referencesource.
В распакованном виде исходники занимают ~ 300 MB.
Теперь плохие новости, с которыми вы можете столкнуться, но которых мне довелось избежать. Например, Скотту Хансельману нужно было поставить hot fix для 64-битной Windows. Вот ссылка на оригинальную статью: ".NET Framework Library Source Code available for viewing". Теперь те ошибки, которые связаны с Visual Studio 2013, известны компании Microsoft и описаны в Configure Visual Studio 2013 for debugging .NET framework, в пункте под названием Troubleshooting. В целом процесс отладки .NET Framework библиотек довольно-таки увлекательный и несложный. Для этого вам нужны будут, по сути, два вспомогательных окна: Call Stack, которое вы можете вызвать с помощью горячих клавиш Ctrl+Alt+C и которое показывает загруженные сборки, стек потока и многое другое, а также окно Modules, для которого также есть горячие клавиши Ctrl+Alt+U и которое показывает список загруженных сборок. На рисунке ниже показано, откуда эти окна можно вызвать.
С помощью того же окна Modules вы сможете убедиться в том, что ваши .pdb-файлы успешно загружены по тому пути, который вы указали в настройках. На рисунке ниже показано мое окно Modules с путем к загруженным .pdb-файлам.
На этой ноте буду завершать данную статью. Если у вас остались какие-то вопросы, буду рад на них ответить. Счастливой отладки.

No comments:

Post a Comment