Отладка исходного кода .Net Framework в MS VS 2008 и не толькоИсточник: mhabrahabr
Конечный результат, к которому мы здесь стремимся - возможность отладчиком любой 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" перед тем как продолжить. Установите следующие настройки:
Все должно получиться примерно так:
3) Далее выберите из дерева свойств Debugging > Symbols. Установите источник символов для скачивания и места на Вашем жестком диске, где Visual Studio будет их кэшировать: Все, установка произведена!
Отладка внутри исходного кода FrameworkДля этого возьмем простой пример. Создадим пустой C# Windows Application проект. Установим точку входа на Form_Load.
Запускаем отладку решения. Когда работа программы остановится в поставленной нами точке останова, перейдите в окно Call Stack. В стеке вызовов щелкните правой кнопкой мыши по строке, начинающейся с System.Windows.Forms.dll и выберите Load Symbols. Надеемся что у Вас хороший Интернет канал. В противном случае запаситесь заранее булочками и чаем. Файлы, подлежащие загрузке весят порядка 10 мегабайт. Обратите внимание, что Visual Studio не будет отвечать все это время (минус им в карму. Хороший тон - индикатор загрузки. А вдруг висит? Тогда убить процесс. А если не висит? Убивать - время жалко). Однако такая загрузка производится лишб однажды и будет храниться у Вас на компьютере в каталоге с кэшем, указанным Вами выше.
Эти действия позволят загрузить символы из DLL с севрера, и Вы увидете что все строки, обозначающие вызовы внутри System.Windows.Forms.dll станут черными, т.е. доступными. Также станут доступными и номера строк. Помните, что каждый раз, когда Вам понадобится посмотреть на символы, нужно будет щелкнуть правой клавишей мыши и выбрать Load Symbols.
Итак, с этого момента загружены все символы для System.Windows.Forms.dll и теперь можно смотреть его код. Код вы можете просматривать совершенно также как и во время обычной отладки своего кода. Для этого, как обычно, щелкните дважды по строке CallStack либо зайдите внутрь методов сборки по (F11). Когда Вы в первый раз попробуете просмотреть код, то Вам предложат лицензию, на основани которой Вам разрешено его читать, и если Вы согласны с ней, нажмите Accept, после чего исходный код будет загружен.
Теперь для всех сборок, в которых Вы захотите отлаживаться, просто повторите все те шаги, которые описаны выше. Если Вам понадобилось отладки тех сборок, которых нет в Call Stack, откройте окно Modules и загрузите символы оттуда.
Теперь Вы можете в примере выше зайти в код DrawRectangle по F11.
Для продвинутых пользователейКак правило, при каждом сеансе отладки, Visual Studio пытается загрузить символы для каждой DLL, которая загружается в отлаживаемый процесс. Чтобы найти информацию по символам, она порсматривает все пути, указанные в Options > Debugging > Symbols. Но есть проекты, которые используют очень много библиотек DLL, для которых нет никакой информации по символам. В этих случаях процесс запуска отладки будет очень долгим. Это основная причина, из-за которой мы советуем Вам использовать загрузку символов по требованию пользователя. Существует, однако, способ сделать загрузку символов автоматически (что по сути, избавляет от шага "Load Symbols"), что увеличивает общую производительность. Этот флажок имеет смысл устанавливать только продвинутым пользователям системы, поскольку потом Вам придется довольно часто возвращаться в этот диалог. Кстати, для того чтобы быстро в него зайти, выберите "Symbol Settings..." в контекстном меню на изображении повыше. Основа этого - получить все символы, скачать их и храниьб локально. Для этого отключите флажок "Search the above locations...". После этого запустите свой проект в отладчике. Да, кстати, извините, совсем забыл сказать. Наберитесь терпения, чаем и булочками. В зависимости от соединения скачивать студия будет либо долго, либо очень долго. Всего понадобится скачать порядка 50 мегабайт. И т.к. все это будет закешировано, то эот будет единовременно.
Как только этот процесс завершится, можно остановить отладчик и снять источник с адресом сервера и нажать OK:
После этих шагов все символы будут загружаться автоматичсеки, и Вы будете иметь возможность вмешиваться в стек вызовов без ранних ограничений. Обратите внимание, что если Вы будете работать над другим проектом, в котором не будет информации по загруженным символам, порсто повторите все эти шаги ;)
FAQ1) Когда я выбираю "Load Symbols", то получаю диалоговое окно "Open File", в котором порсят указать положение .pdb файла
Также проверьте ваш "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE" (или то место, куда Вы установили Visual Studio) файл с именем symsrv.no. Если этот файл существует, переименуйте его в symsrv.yes. 2) Когда я пытаюсь зайти отладчиком внутрь исходного кода, то получаю диалог "Source is not available for this location" 3) Я также использую Microsoft Symbol Server для загрузки символов. В чем разница? Microsoft Symbol Server обеспечит Вас символами без предоставления какой-либо информации в них. Эта информация будет удалена перед публикацией. Чтобы использовать и Reference Source path и Micrososft Symbol Server это расположение Reference Source path первым в списке
Однако если у Вас Microsoft Symbol Server настраивается через _NT_SYMBOL_PATH, помните, что _NT_SYMBOL_PATH перекрывает эти настройки. 4) Есть ли поддержка 64-разрядной ОС? Да, при условии наличия 64-разряднных версий PDB. Здесь стоит отметить что есть DLL, которые работают на различных архитектурах. Потому для них понадобится всего одна PDB. 5) Как мне установить точки останова в коде Framework? Изначально, Visual Studio требует чтобы код в точности соответствовал PDB файлу. Хотя довольно часто PDB файлы изменены не значительно. Например, автор добавил строки с авторскими правами. Но код по-прежнему можно легко отлаживать. Просто установите точку останова (появится не полностью закрашенная точка) и укажите расположение PDB файла (контекстное меню от точки останова, позиция Location...)
Затем установите флажок, указанный ниже:
После этих действий Вы сможете спокойно продолжить работу. 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), скачайте его и запустите следующим образом:
И естественно, этот метод хорош, когда у Вас нет MSVS 2008, а установлена, например, MS VS 2005 или CodeGear's RAD Studio либо #develop. Настройте Visual Studio так, как показано ниже:
|