«System.Web.pdb not loaded» или более изощрённые приёмы отладки исходного кода .NET Framework в приложении ASP.NET

За последние несколько месяцев не приходилось и не было нужды использовать отладку исходного кода .NET Framework. Вот только помню то, что отладка работала и в Visual Studio 2012 и в Visual Studio 2012 Update 1. Сегодня появилась такая необходимость, но вот незадача: Visual Studio 2012 Update 3 никак не хочет грузить символы отладки с серверов Microsoft, сколько я её не "уговаривал" - всё бестолку. Вот тут и пришлось вспомнить про старые и добрые приёмы. Если быть более точным, то про возможность рефлектора создавать файлы символов на основе текущей сборки. Если честно, я её толком и не применял, а так, просто баловался раньше. Ввиду того, что символы отладки загружались и работали "на ура". Но сегодняшний день показал, что данная возможность может быть очень полезной, и поэтому решил поделиться информацией. Для демонстрации, кроме самой студии, нам понадобится .NET Reflector, но об этом позже. Для начала создаём пустое приложение ASP.NET.



Добавляем глобальный класс приложения и точку останова.



Выбираем опции загрузки символов .NET Framework.



Устанавливаем источники символов для отладки.



У меня на машине их много.



Запускаем отладку. Отладчик начинает загружать их.



Открываем окно стека вызовов и пытаемся загрузить символы для сборки System.Wed.dll.



Ничего не выходит. Если посмотреть на рисунок внимательно, то можно увидеть, что файлы символов для отладки с нужной контрольнной суммой не найдены ни на моей машине (хотя у меня на компьютере установлены все версии загруженные с сервера, а также много их в кеше, который я не очищал со времён Update1 для студии), ни на серверах Microsoft.



Что делать, как выйти из данной ситуации?



Используем рефлектор.



Создаём файл символов для нашей System.Web.dll.



Запускаем прцесс генерации файла сиволов для используемой в настоящий момент сборки.



Процесс ресурсоёмкий и занимает некоторое время.



Всё готово, файл создан.



Меняем источник символов. В данном случае он создаётся рефлектором.



Отключаем все опции, которые не нужны. Саму опцию входа в исходный код .NET, также отключаем.



Запускаем отладчик. Открываем окно стека вызовов и дважды щёлкаем на один из методов. Цвет метода по прежнему остаётся серым (в случае с оригинальными версиями символов отладки он становится чёрным).



И что мы видим? Да, тот самый код класса HttpApplication. Ставим точку останова, например, в методе вызова модулей конвейера ASP.NET.



И видим,



 что всё работает.



Очередные важные и необходимые знания в арсенале разработчика.