Pull to refresh

Отладка исходного кода .Net Framework в MS VS 2008 и не только

Reading time7 min
Views7.7K
Original author: Shawn Burke, ScottGu, Paul Krill, John Robbins
Перевод нескольких статей, в т.ч. Shawn Burke (thanks!), ScottGu(thanks!), Paul Krill (thanks!) и John Robbins (First great thanks! Second great thanks!)

Конечный результат, к которому мы здесь стремимся — возможность отладчиком любой IDE войти «внутрь» вызова .Net Framework методов. Я надеюсь, этот пост содержит все, что вам понадобится. Последние несколько недель мы провели много экспериментов и собрали очень много данных по этому вопросу. И мы хотим поделиться полученным опытом с сообществом.



Способ #1: Конфигурирование Visual Studio для отладки исходного кода .NET Framework (только Visual Studio 2008. Теоретически — 2010)


Если у Вас есть какие-либо проблемы, пожалуйста, для начала убедитесь что Вы выполнили все шаги. В ТОЧНОСТИ как написано у нас. Если все же ничего не помогает, обратите внимание на секцию FAQ в конце документа. Если и это не заработает, пишите Ваши комментарии, мы будем решать их все вместе.

Основная настройка

Для начала отмечу, что если у Вас установлена MS VS 2008 Express Edition, то у Вас это работать не будет.

1) Установите Visual Studio QFE. Это исправление просто обновляет DLL, которые являются частью отладчика Visual Studio, который выбирает исходные файлы. Все подробности оп исправлениям читайте на странице загрузки.

Если вы получили сообщение об ошибке установки обновления, попробуйте вставить ваш DVD VS 2008 и запустите EXE снова. Это возможно поможет установить исправление правильно.

2) Запустите Visual Studio и выберите Tools > Options > Debugging > General. Если Вы работаете над Visual Basic Profile, Вам необходимо установить флажок в нижней части диалога Options Dialog, «Show All Settings» перед тем как продолжить.

Установите следующие настройки:
  • Выключите «Enable Just Me Code (Managed only)»
  • Включите «Enable source server support»

Все должно получиться примерно так:

image

3) Далее выберите из дерева свойств Debugging > Symbols. Установите источник символов для скачивания и места на Вашем жестком диске, где Visual Studio будет их кэшировать:
Добавьте в Symbol file (.pdb) location адрес: http://referencesource.microsoft.com/symbols
Задайте расположение кэша. Убедитесь в том что это место имеет права на чтение и запись. Отличный вариант — место Ваших документов. Например, C:\Users\Stanislav\VsSymbols.
Включите флажок: Search the above locations only whan symbols are loaded manually.

Все, установка произведена!

Отладка внутри исходного кода Framework

Для этого возьмем простой пример. Создадим пустой C# Windows Application проект. Установим точку входа на Form_Load.

image

Запускаем отладку решения. Когда работа программы остановится в поставленной нами точке останова, перейдите в окно Call Stack. В стеке вызовов щелкните правой кнопкой мыши по строке, начинающейся с System.Windows.Forms.dll и выберите Load Symbols. Надеемся что у Вас хороший Интернет канал. В противном случае запаситесь заранее булочками и чаем. Файлы, подлежащие загрузке весят порядка 10 мегабайт. Обратите внимание, что Visual Studio не будет отвечать все это время (минус им в карму. Хороший тон — индикатор загрузки. А вдруг висит? Тогда убить процесс. А если не висит? Убивать — время жалко). Однако такая загрузка производится лишб однажды и будет храниться у Вас на компьютере в каталоге с кэшем, указанным Вами выше.

image

Эти действия позволят загрузить символы из DLL с севрера, и Вы увидете что все строки, обозначающие вызовы внутри System.Windows.Forms.dll станут черными, т.е. доступными. Также станут доступными и номера строк. Помните, что каждый раз, когда Вам понадобится посмотреть на символы, нужно будет щелкнуть правой клавишей мыши и выбрать Load Symbols.

image

Итак, с этого момента загружены все символы для System.Windows.Forms.dll и теперь можно смотреть его код. Код вы можете просматривать совершенно также как и во время обычной отладки своего кода. Для этого, как обычно, щелкните дважды по строке CallStack либо зайдите внутрь методов сборки по (F11). Когда Вы в первый раз попробуете просмотреть код, то Вам предложат лицензию, на основани которой Вам разрешено его читать, и если Вы согласны с ней, нажмите Accept, после чего исходный код будет загружен.

image

Теперь для всех сборок, в которых Вы захотите отлаживаться, просто повторите все те шаги, которые описаны выше. Если Вам понадобилось отладки тех сборок, которых нет в Call Stack, откройте окно Modules и загрузите символы оттуда.

image

image

Теперь Вы можете в примере выше зайти в код DrawRectangle по F11.

Для продвинутых пользователей

Как правило, при каждом сеансе отладки, Visual Studio пытается загрузить символы для каждой DLL, которая загружается в отлаживаемый процесс. Чтобы найти информацию по символам, она порсматривает все пути, указанные в Options > Debugging > Symbols. Но есть проекты, которые используют очень много библиотек DLL, для которых нет никакой информации по символам. В этих случаях процесс запуска отладки будет очень долгим. Это основная причина, из-за которой мы советуем Вам использовать загрузку символов по требованию пользователя.

Существует, однако, способ сделать загрузку символов автоматически (что по сути, избавляет от шага «Load Symbols»), что увеличивает общую производительность. Этот флажок имеет смысл устанавливать только продвинутым пользователям системы, поскольку потом Вам придется довольно часто возвращаться в этот диалог. Кстати, для того чтобы быстро в него зайти, выберите «Symbol Settings...» в контекстном меню на изображении повыше.

Основа этого — получить все символы, скачать их и храниьб локально. Для этого отключите флажок «Search the above locations...».

После этого запустите свой проект в отладчике. Да, кстати, извините, совсем забыл сказать. Наберитесь терпения, чаем и булочками. В зависимости от соединения скачивать студия будет либо долго, либо очень долго. Всего понадобится скачать порядка 50 мегабайт. И т.к. все это будет закешировано, то эот будет единовременно.

image

Как только этот процесс завершится, можно остановить отладчик и снять источник с адресом сервера и нажать OK:

image

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

FAQ

1) Когда я выбираю «Load Symbols», то получаю диалоговое окно «Open File», в котором порсят указать положение .pdb файла
Это может происходить в четырех ситуациях:
  1. Вы не настроили либо настроили, но не верно адрес сервера: referencesource.microsoft.com/symbols
  2. Вы выбрали каталог для кэша таким образом, что Ваша учетная запись не позволяет Visual Studio записывать либо считывать файлы по этому пути
  3. Вы пытаетесь загрузить символы для DLL, для которых их не существует
  4. У вас может быть установлена другая версия .NET Framework. Это может происходить, например, если у вас установлена Microsoft Server 2008 Beta. Чтобы проверить это, посмотрите номер версии для сборки mscorlib.dll Она должна быть 2.0.50727.1433, если нет, установитье RTM версию .NET Framework 3.5


image

Также проверьте ваш «C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE» (или то место, куда Вы установили Visual Studio) файл с именем symsrv.no. Если этот файл существует, переименуйте его в symsrv.yes.

2) Когда я пытаюсь зайти отладчиком внутрь исходного кода, то получаю диалог «Source is not available for this location»
Во-первых посмотрите пункт (2) в FAQ. чтобы убедиться что все символы были загружены успешно. В этом можно убедиться, посмотрев в окно Modules, в колонку статуса символов. Если символы загружены, проверьте следующее:
Если Вы настроили Microsoft Symbol Server в прошлом, и Вы загрузили символы для этой DLL, которые не содержат исходных кодов. Попробуйте указать другое положение кэша либо удалите существующий кэш, после чего поврите команду «Load Symbols». Посмотрите также FAQ (3) для получения дополнительной информации.
Убедитесь лишний раз в том что Вы включили флажок «Enable Source Server» в окне Tools > Options > Debugging > General.
Убедитесь что папка, которая настроена на сбор кэша символов, имеет разрешения на чтение и запись
Если у Вас установлена _NT_SYMBOL_PATH, она будет переопределять все эти настройки. За подробностями сюда

3) Я также использую Microsoft Symbol Server для загрузки символов. В чем разница?

Microsoft Symbol Server обеспечит Вас символами без предоставления какой-либо информации в них. Эта информация будет удалена перед публикацией. Чтобы использовать и Reference Source path и Micrososft Symbol Server это расположение Reference Source path первым в списке

image

Однако если у Вас Microsoft Symbol Server настраивается через _NT_SYMBOL_PATH, помните, что _NT_SYMBOL_PATH перекрывает эти настройки.

4) Есть ли поддержка 64-разрядной ОС?

Да, при условии наличия 64-разряднных версий PDB. Здесь стоит отметить что есть DLL, которые работают на различных архитектурах. Потому для них понадобится всего одна PDB.

5) Как мне установить точки останова в коде Framework?

Изначально, Visual Studio требует чтобы код в точности соответствовал PDB файлу. Хотя довольно часто PDB файлы изменены не значительно. Например, автор добавил строки с авторскими правами. Но код по-прежнему можно легко отлаживать. Просто установите точку останова (появится не полностью закрашенная точка) и укажите расположение PDB файла (контекстное меню от точки останова, позиция Location...)

image

Затем установите флажок, указанный ниже:

image

После этих действий Вы сможете спокойно продолжить работу.

6) Почему такие функции как «Go To Defenition» не работают?

Потому что эта информация создается на периоде работы с кодом, а не во время исполнения.

7) Почему некоторые члены или локальные переменные не доступны? Почему я не могу заходить внутрь некоторых методов или ходить по некоторым строчкам кода?

Это означает что .NET Framework оптимизирует код по размеру и производительности. Часть из этих оптимизаций удаляет некоторую информацию, когда она более не нужна. Отладка это отражает. Однако большинство отладочной информации по прежнему присутствует в сессии и простановка точек останова в начале методов позволяет сделать ее видимой. Вторая причина может заключаться в том что часть методов являются встроенными, что означает что Вы не сможете зайти внутрь этих методов. Но по большей части исходных кодов Вы сможете свободно отлаживаться.

8) Почему так долго загружаются PDB файлы?

Потому что их много, и среди них есть файлы под 1 мегабайт.

9) Можно ли открыть и посмотреть их через браузер?

Нет, вы получите ошибку HTTP 400.

Способ #2: Скачать с официального сайта Microsoft одним архивом (любая IDE)


Для того чтобы скачать все символы и исходные коды одним архивом, пройдите по ссылке: http://referencesource.microsoft.com/netframework.aspx.
Однако из всего набора предоставленных ссылок для скачивания, у меня работала всего одна. Не солидно.

Способ #3: .NET MASS DOWNLOADER (любая IDE)


Предназначен для скачивания всех символов и исходных кодов. Работает из командной строки и доступен в исходных кодах.

Для того чтобы скачать то что нам нужно, пройдите по ссылке (.NET MASS DOWNLOADER), скачайте его и запустите следующим образом:

  • Для 32 разрядных систем: NetMassDownloader.exe -d «C:\Windows\Microsoft.Net\Framework\v2.0.50727» -d «C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5»
  • Для 64 разрядных систем: NetMassDownloader.exe -d «C:\Windows\Microsoft.Net\Framework\v2.0.50727» -d «C:\Windows\Microsoft.Net\Framework64\v2.0.50727» -d «C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5» -d «C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5»
И естественно, этот метод хорош, когда у Вас нет MSVS 2008, а установлена, например, MS VS 2005 или CodeGear's RAD Studio либо #develop.
Настройка Visual Studio для способов #2 и #3

Настройте Visual Studio так, как показано ниже:

image

image

image

Progg it
Tags:
Hubs:
Total votes 14: ↑12 and ↓2+10
Comments10

Articles