Я пытаюсь отследить проблему с MVC, поэтому я решил войти в исходный код ASP .NET Core. Я снял флажок «Включить только мой код» и проверил «Включить пошаговое выполнение исходного кода .NET Framework» (хотя, полагаю, в этом нет необходимости). Я также проверил «Включить поддержку исходного сервера» и включил сервер символов Microsoft.

Я вступаю в эту линию

app.UseMvc();

И в конце концов я получаю этот код в MvcApplicationBuilderExtensions.cs.

VerifyMvcIsRegistered(app);

var options = app.ApplicationServices.GetRequiredService<IOptions<MvcOptions>>();

if (options.Value.EnableEndpointRouting)
{

Проходя по этому коду, программный счетчик начинает перепрыгивать, и я получаю сообщение об ошибке, что некоторые из локальных переменных не могут получить значение, потому что оно недоступно или было оптимизировано. Я предполагаю, что это потому, что исходный файл и файлы символов не совпадают.

Я запускаю это на Visual Studio 2019. Это .net Core 2.2.203. Я удалил кэш символов и кэш SourceServer. Я пытаюсь выяснить, что я сделал неправильно в своем коде и почему.

На самом деле, я пытался отлаживать исходный код .NET несколько раз за последние несколько лет, и у меня всегда одна и та же проблема. Ни одна из онлайн-справок, похоже, не имеет ответа. Я делаю что-то не так или это просто ненадежно?

0
Brian Heilig 18 Апр 2019 в 17:17

2 ответа

Лучший ответ

Сообщение является точным и объясняет, что именно происходит. Это не имеет ничего общего с несовпадающими символами.

(Не) проблема, как объясняется в сообщении, заключается в том, что IL был оптимизирован во время компиляции, эти переменные больше не существуют. Сборка выпуска выполняет много оптимизаций, которые обычно заканчивают тем, что удаляют части кода, которые не нужны.

Функции могут и нередко являются встроенными. Например, переменная может быть заменена регистром. Цикл может быть полностью исключен. Когда этот код запускается, переменных или функций больше нет, поэтому они не могут быть отображены.

Символы отладки все еще могут быть сгенерированы в сборке Release. Они будут отражать IL, сгенерированный для сборки релиза. Чтобы получить IL, соответствующий источнику без каких-либо оптимизаций, нужны сборки, скомпилированные в конфигурации Debug.

Это верно для среды выполнения .NET Core, нашего собственного кода при запуске сборки выпуска и всех пакетов NuGet.

1
Panagiotis Kanavos 18 Апр 2019 в 15:49

Если вы хотите отлаживать исходный код .NET Core, вы можете загрузить его с github (https://github.com/dotnet / corefx ) . Это очень легко отлаживать, как ваш собственный проект.

Есть очень хорошее видео, где объясняется, как работает жизненный цикл запроса .NET Core MVC (https://app.pluralsight.com/library/courses/aspnet-core-mvc-request-life-cycle/table-of-contents), возможно там вы можете найти информацию, которая вам нужна.

Постскриптум Вы можете получить 3 месяца бесплатно с помощью учетной записи Microsoft.

1
Tomas Kuzminskas 18 Апр 2019 в 15:35