【问题标题】:Debugging ASP .Net Core symbols and source don't match调试 ASP .Net Core 符号和源不匹配
【发布时间】:2019-09-08 21:45:06
【问题描述】:

我正在尝试查找 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 源代码,但总是遇到同样的问题。在线帮助似乎都没有答案。是我做错了什么还是这不可靠?

【问题讨论】:

  • 消息准确,与符号不匹配无关。顺便说一句,您正在调查什么错误?你确定它一个错误*吗?如果你真的想以原始形式调试源代码,你应该克隆它,在你的项目中引用它并使用它。
  • 我试图弄清楚为什么属性路由在 .NET Core 控制台应用程序中不起作用。见这里stackoverflow.com/a/50640882/2403720
  • 这里向您展示如何调试 ASP.NET Core 源代码:levelup.gitconnected.com/…

标签: visual-studio debugging asp.net-core-mvc debug-symbols


【解决方案1】:

该消息准确无误,并准确解释了发生的情况。它与不匹配的符号无关。

消息解释的(非)问题是 IL 已在编译期间进行了优化,这些变量不再存在。发布版本会执行许多优化,这些优化通常最终会消除不需要的部分代码。

函数可以并且经常是内联的。例如,变量可以用寄存器代替。可以完全消除循环。当该代码运行时,变量或函数不再存在,因此无法显示。

仍然可以在发布版本中生成调试符号。它们将反映为发布版本生成的 IL。需要在 Debug 配置中编译的程序集才能获得与源匹配的 IL,而无需任何优化。

对于 .NET Core 运行时、运行 Release 构建时我们自己的代码和所有 NuGet 包都是如此。

【讨论】:

  • 我是个傻瓜,没想到这一点。
【解决方案2】:

如果您想调试 .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),也许你可以在那里找到你需要的信息。

附:您可以使用 Microsoft 帐户在复数视图中免费获得 3 个月。

【讨论】:

  • 这非常有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多