Debugging ASP .Net Core symbols and source don't match

I'm trying to track down an issue with MVC so I thought I would step into the ASP .NET Core source code. I've unchecked "Enable Just My Code" and I've checked "Enable .NET Framework source stepping" (although I guess that's not necessary). I've also checked "Enable source server support" and enabled the Microsoft symbol server.

I step into this line


and eventually I get to this code in MvcApplicationBuilderExtensions.cs.


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

if (options.Value.EnableEndpointRouting)

Stepping through this code the program counter starts to jump around and I receive an error that several of the local variables cannot obtain the value because it is not available or it's been optimized away. I assume this is because the source file and the symbol files don't match.

I'm running this on Visual Studio 2019. It's .net Core 2.2.203. I've deleted the symbol cache and the SourceServer cache. I'm trying to figure out what I've done wrong in my code and exactly why.

Actually, I've tried to debug .NET source code several times over the past several years and I always have the same issue. None of the online help seems to have an answer. Am I doing something wrong or is this just unreliable?

2 answers

  • answered 2019-04-18 15:35 Tomas Kuzminskas

    If you want to debug .NET Core source code you can download it from github ( It's very easy to debug, like your own project.

    There is very good video, where explains how .NET Core MVC request life cycle works (, maybe there you can find information which you need.

    P.S. you can get 3 months free in pluralsight with microsoft account.

  • answered 2019-04-18 15:49 Panagiotis Kanavos

    The message is accurate and explains exactly what happens. It has nothing to do with mismatched symbols.

    The (non) problem as the message explains is that the IL has been optimized during compilation, those variables no longer exist. A Release build performs a lot of optimizations that usually end up eliminating parts of the code that aren't needed.

    Functions can and quite often are inlined. A variable may be replaced by a register for example. A loop may be eliminated entirely. When that code runs the variables or functions are no longer there so they can't be displayed.

    Debug symbols can still be generated in a Release build. They'll reflect the IL generated for a release build though. One would need assemblies compiled in a Debug configuration to get IL that matched the source without any optimizations.

    That's true for the .NET Core runtime, our own code when run a Release build and all NuGet packages.