Как включить «Включить степпинг исходного кода .NET Framework»?

118

Обновление от 22 февраля 2013 г . : В записи Microsoft Connect есть примечание от Алока Ширама (менеджер программ, библиотеки базовых классов, .NET Framework) о том, что проблема должна быть решена. Запись Connect помечена как Решенная (фиксированная) :

Теперь эта проблема должна быть исправлена. Мы опубликовали обновление справочных источников. Сообщите нам, если проблема все еще не решена.

Полтора года.

Бонусные ссылки

Исходный вопрос

Как включить пошаговое выполнение исходного кода .NET framework в Visual Studio 2010?


Примечание . Этот вопрос является частью большого целого:


Visual Studio 2010 поставляется с новой функцией:

  • Инструменты, Параметры, Отладка, Общие, Включить пошаговое выполнение исходного кода .NET Framework

Снимок экрана меню параметров

Следуя инструкциям на странице MSDN Как выполнить отладку источника .NET Framework :

Включение отладки исходного кода .NET Framework

  1. В меню " Сервис " выберите " Параметры" .

  2. В диалоговом окне « Параметры » щелкните категорию « Отладка ».

  3. В поле Общие установите следующие флажки:

    • Включить пошаговое выполнение исходного кода .NET Framework
    • Включить поддержку исходного сервера

Я сделаю это:

Снимок экрана меню опций, выделение соответствующих выбранных опций

Примечание : вы заметите, как указано на странице MSDN, и, как я заметил, установка флажка «Включить пошаговое выполнение исходного кода .NET Framework» автоматически снимает флажок ** Включить только мой код (только для управляемого кода). Я также включил диагностические сообщения поддержки исходного сервера.

Включение этих параметров автоматически устанавливает для меня место загрузки кеша символов:

Снимок экрана меню параметров, показывающий каталог кеша (выделен)

Примечание . Запись Microsoft Symbol Server уже присутствует (и не может быть удалена).


На странице MSDN говорится о загрузке символов:

Чтобы загрузить символы Framework с помощью окна модулей

  1. В окне " Модули" щелкните правой кнопкой мыши модуль, для которого не загружены символы. Вы можете определить, загружены ли символы, по столбцу « Статус символов» .

  2. Наведите указатель мыши на « Загрузить символы из» и щелкните « Серверы символов Microsoft», чтобы загрузить символы с общедоступного сервера символов Microsoft, или «Путь к символам» для загрузки из каталога, в котором ранее были сохранены символы.

Я пробую это:

введите описание изображения здесь

а затем загружаются все символы:

Скриншот окна модулей, как описано выше

Я сижу на точке останова, которая вот-вот вызовет код .NET framework:

Скриншот кода, расшифрованный ниже

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

При нажатии F11отладчик просто переходит к следующей строке:

Скриншот кода, расшифрованный ниже

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

    //Record the running scale factor used
    this.scaleFactor = new SizeF(
            this.scaleFactor.Width * factor.Width,
            this.scaleFactor.Height * factor.Height);

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Я сижу в точке останова в своем коде. Я пытаюсь дважды щелкнуть функцию выше в стеке вызовов. Я надеюсь, что это позволит мне перейти к коду .NET:

введите описание изображения здесь

За исключением того, что это не работает: Visual Studio сообщает мне, что источник недоступен:

Скриншот сообщения об ошибке: "Источник недоступен"

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Если я переключаюсь в режим дизассемблирования перед тем, как перейти к .NET-коду ( Debug -> Windows -> Disassembly ), я могу увидеть callв коде .NET:

Скриншот кода

И когда я это делаю, я заканчиваю отладку дизассемблера System.Windows.Forms.ScaleControl:

Скриншот окна разборки

Это не то же самое, и не то же самое, что возможность войти в исходный код .NET Framework.

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Настроенный путь кэша символов на моем компьютере действительно содержит файлы кэша символов:

Снимок экрана со списком папок

Таким образом, он загружает pdbфайлы символов, но отказывается их использовать.

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Леппи посоветовал мне проверить Debugжурнал (с открытым окном журнала отладки; в противном случае он ничего не регистрирует):

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Ранее в журнале я вижу, что он загружает символы для System.Windows.Forms.dll:

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

введите описание изображения здесь

Так ему будет найти свои символы, но утверждает , что он не мог их найти.

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Парень из Microsoft Italy предлагает отключить Требовать, чтобы исходные файлы точно соответствовали исходной версии :

Скриншот окна настроек

Это не помогло.

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Было высказано предположение, что в исходном сервере Microsoft для .NET Framework 4.0 есть ошибка . Следуя этому предложению, я переключил проект на целевой .NET Framework 3.5 :

введите описание изображения здесь

Это не помогло.

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Кто-то где-то праздно гадал, не использовал ли другой человек, столкнувшийся с такой же проблемой, 64-битную версию отладчика . Сейчас нет такой вещи, как 64-битная версия Visual Studio, но я попытался переключить свой проект с AnyCPU на x86 (он был JITed на x64), на случай, если Microsoft не поддерживает 64-битные процессоры:

введите описание изображения здесь

Это не помогло:

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Как включить пошаговое выполнение исходного кода .NET Framework в Visual Studio 2010?


Смотрите также

Ян Бойд
источник
Вы проверили "кеш" исходного кода?
leppie
@leppie Что вы имеете в виду под "кешем исходного кода"? Если вы имеете в виду папку, в которой кэшируется исходный код, она заполняется (см. Обновление 4 )
Ян Бойд
Да. Можно ли открыть этот исходный файл и установить точку останова?
leppie
1
отличное описание вопроса!
andersonbd1
1
В VS2012 тоже не работает. Работало сутки, после того как я все настроил и просто перестал работать. Два дня, десятки чашек, сотни веб-страниц спустя - это просто не работает. В то же время источники, опубликованные на symbolsource.org, действительно работают как шарм.
Wiktor Zychla

Ответы:

35

PDB для пошагового выполнения исходного кода публикуются только для RTM и пакетов обновления. Таким образом, когда выходит обновление для системы безопасности, и оно изменяет DLL, которую вы пытаетесь отладить, это приведет к тому, что пошаговое выполнение исходного кода не будет работать (то есть вы получите сообщение «Нет доступных источников» с выделенным серым цветом «Обзор, чтобы найти исходный код»). «).

Однако после того, как вы выполните все необходимые настройки, вы можете использовать следующий обходной путь. Обходной путь заключается в том, чтобы найти обновления безопасности, которые привели к изменению библиотеки DLL, а затем удалить их. Это имеет очевидный недостаток - удаление этих обновлений безопасности на вашем компьютере.

Временное решение

  1. Определите, какую DLL вы хотите отлаживать (например, System.Windows.Forms.dll).
  2. Во время отладки откройте окно « Модули» в Visual Studio и найдите столбец « Версия» . Если версия не является окончательной первоначальной версией или версией пакета обновления, вам необходимо выполнить рабочий процесс. Обычно dll RTM говорит: «Построено: RTMRel». В то время как dll, входившая в состав обновления безопасности, будет сообщать «построен: RTMGDR». Обратите внимание на номер версии (например, 4.0.30319.269, созданный: RTMGDR)
  3. Теперь мы хотим найти обновление, создавшее эту версию. Сделайте это, выполнив поиск dll и номера версии на support.microsoft.com/kb/. Например, я выполнил следующий поиск в Google: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. В результате поиска должна появиться информация об обновлении. Обратите внимание на номер КБ в адресной строке. В моем примере адрес был http://support.microsoft.com/kb/2604121таким, что нас интересует KB2604121.
  5. Перейдите в Панель управления-> Программы и компоненты и нажмите «Просмотреть установленные обновления».
  6. Найдите обновление, в котором указан номер базы знаний (вы можете использовать поиск в правом верхнем поле).
  7. Удалите это обновление.
  8. Повторите этот процесс для той же библиотеки DLL, пока она не вернется к своей версии RTMRel или версии SP. Например, для System.Windows.Forms.dll мне пришлось удалить KB2686827, KB2604121, KB2518870, прежде чем он вернулся в версию RTMRel.

Вам нужно будет сделать это для каждой dll в .NET framework, в которой вы хотите отлаживать.

Как только это будет сделано, установите точку останова в источнике .net (например, перейдите на вкладку «Точки останова», скажите New-> Break at Function и введите System.Windows.Forms.Form.Form) или войдите в один из .net методы в этой dll.

Мэтт Смит
источник
1
Правильно, уловка заключается в том, чтобы найти нужные для удаления (поскольку обычно у вас установлено много из них, и их удаление занимает некоторое время).
Мэтт Смит
Я не могу удалить обновления безопасности. Это противоречит политике компании. Есть ли способ получить копии mscorlib.dll (и других), соответствующие серверу Microsoft Symbols? У меня mscorlib.dll версия 4.0.30319.269 (RTMGDR.030319-2600). Возможно, я мог бы временно обновить GAC этой новой DLL и попробовать пошаговое выполнение исходного кода.
kevinarpe
Вероятно, это также противоречит политике моей компании - я просто переустанавливаю их после того, как закончу. Я не думаю, что вы могли бы просто вставить старую версию mscorlib.dll независимо от других dll, которые должны быть откатаны вместе с ней (чтобы она работала должным образом). Кроме того, временное обновление GAC со старыми библиотеками DLL по существу эквивалентно временному удалению обновления безопасности.
Мэтт Смит
Вероятная причина того, что Microsoft не публикует источник обновлений безопасности, заключается в том, что кто-то может сравнить изменения кода, понять, в чем заключалась уязвимость системы безопасности, и создать свои собственные эксплойты. Чего Microsoft не понимает, так это того, что «исходный код» уже доступен с использованием ILSpy или Relfector. Таким образом, Microsoft, не выпуская исходный код, на самом деле никого не делает безопаснее - просто разработчикам становится сложнее.
Ian Boyd
2
@IanBoyd Я сомневаюсь, что это мотивация MS. Я предполагаю, что их рабочий процесс просто не поддерживает обновление исходных PDB для отладки. В первую очередь их заботит закрытие дыр в безопасности.
xanadont
6

Хотя, к сожалению, есть проблема с Microsoft, как указал Леппи (и я получил тот же результат, см.

Следует отметить, что ваша попытка все равно не удастся, поскольку вы ссылались:

  • Сервер символов Microsoft

вместо того:

  • referencesource.microsoft.com/symbols

См. Раздел «Часто задаваемые вопросы / Устранение неполадок» в разделе « Настройка Visual Studio для отладки исходного кода .NET Framework».

Йоэль Халб
источник
4

Думаю, я нашел ответ.

Я проследил, что происходило на Fiddler. Кажется, в настоящее время доступны только символы, а не источник.

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

http://referencesource.microsoft.com/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pdb

После указанной выше ошибки он пытается использовать какой-то сервер с именем 'msdl', где находит фактическую PDB (но, похоже, у этого нет информации об исходном коде).

http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pd_

В общем, похоже, что это (временная) проблема Microsoft с их серверами.

Я уверен, что некоторое время назад у меня был исходный код. Но сейчас это не работает.

Редактировать:

Пробовал с разными версиями .NET, все тот же результат. :(

leppie
источник
1
Ну , что было бы очень интересно , если мои точные шаги должны работать (но не), будет работать (в будущем), и сделать работу (но не сегодня). Это также было бы чрезвычайно неприятно, поскольку я потратил на эту проблему 11 часов.
Ian Boyd
2
msdl.microsoft.com выглядит как Microsoft Symbol Server
Йоэль Халб
2
и он снова сломан
Simon_Weaver 06
Не похоже, что это «временная проблема с сервером», прошло 7 лет, а ссылки все еще мертвы.
jrh
1

В моем случае я отлаживал старое приложение .NET 2.0 WinForms и получил сообщение «Источник недоступен» . Все рекомендуемые настройки перепробовал.

В конце концов, я перестроил приложение для временного нацеливания на .NET 4.5 и смог заставить исходный код работать. Возможно, мое приложение было слишком старым для степпинга исходного кода. Вроде поражений цель, я знаю, но для быстрого и грязного тестирования работает. Ошибка, которая у меня есть, все еще присутствует в .NET 4.5 . :)

Целевая платформа

Брайан Чавес
источник
0

Вы можете найти справочный источник здесь, доступный для загрузки:

Справочный источник .NET Framework 4.0

Там же можно найти исходники для WCF, WF и даже 4.5 Beta / RC и многих других:

Справочный материал Microsoft NetFramework

Mare Infinitus
источник
3
Исходный код без символов бесполезен. Если вам не нравится искать конкретный фрагмент кода; p
leppie
0

Вот официальные инструкции https://referencesource.microsoft.com/setup.html

Настроить Visual Studio 2013 для отладки .NET framework

Чтобы настроить Visual Studio 2013, выполните следующие действия в меню Инструменты -> Параметры -> Отладка -> Общие:

  • Отключить только мой код
  • Отключить переход через свойства и операторы
  • Отключить требовать, чтобы исходные файлы точно соответствовали исходной версии
  • Включить пошаговое выполнение исходного кода .NET framework
  • Включить поддержку исходного сервера
Полковник Паник
источник