在一次Visual Studio 2022调试会话期间,我正在使用源代码链接和Microsoft符号服务器调试一些ASP.NET内部代码,并且我无法查看变量,因为它已被优化;但是,QuickView有一个选项用于"禁用托管优化并重新启动调试".我 Select 了它,调试重新开始,并且我确实能够查看该变量.然而,我现在担心我已经禁用了一些可能会减慢速度的优化,而且我不清楚 Select 该选项实际上发生了什么变化.这在Visual Studio中更改了哪些设置,以及如何重新启用托管优化?

以下是该选项在用户界面下拉菜单中以及当您单击它时的一些屏幕截图:

Dropdown

Upon click

推荐答案

背景信息:.NET中的不同类型的优化

在许多编译语言中,如C和C++,通常只在一个地方应用优化:当您运行编译器时(尽管对于具有单独的编译器和链接器的旧工具链来说,具有单独的编译时和链接时优化也很常见).

...但在.NET世界中,情况要稍微复杂一些:

  • csc C#-to-IL(或VB.NET-to-IL、F#等)编译器可以优化从C#(the /optimize flag)生成的IL.

    • 这些往往是更简单的优化,比如删除死代码(例如,像if( false ) { /* here */ }这样的块的内容).
  • 当CLR加载构建的.NET程序集(.NET .dll.exe)时,JIT可以应用自己的优化.

    • These tend to be more advanced,例如循环展开和可执行代码内联.
    • 这些JIT时间优化是not,适用于具有DebuggableAttribute( DebuggingModes.DisableOptimizations )isJITOptimizerDisabled: false的装配件-当为using csc.exe with /debug时,该属性被添加到装配件.
  • 虽然严格地说不是编译器"优化",但当.NET程序运行时,CLR可能会加载缓存的native-image versions个托管程序集,这些程序集特定于您的计算机.

    • 对于.NET Framework1.x-4.x程序集,这些本机映像由ngen.exe生成-它(since Windows 8)may在后台抢先编译程序集,而不需要手动运行ngen.exe.
    • 对于.NET 5+,则为see CrossGen2.
    • 这与readytorun和/或AOT编译的程序集不是一回事,后者有自己的优化,超出了这个答案的范围.

推荐读物


在Visual Studio中,"禁用托管优化并重新启动调试"实际更改了哪些设置?

消息框允许您更改工具&选项&调试下的" suppress 模块加载时的JIT优化(仅限托管)"设置:

enter image description here

然而,我现在担心我已经禁用了一些可能会减慢速度的优化

不要担心:"Suppress JIT optimization..."设置只会在调试时阻止对非项目程序集进行JIT优化--尽管在许多情况下仍将使用ngen‘d映像(因此,除非您使用COMPlus_ZapDisable,否则仍然运行优化的cod).

这在Visual Studio中更改了哪些设置,以及如何重新启用托管优化?

转到调试器设置并取消选中"取消JIT优化..." Select .


如果您使用调试器模块窗口来查看加载的每个.NET程序集,以及它的JIT优化状态、符号状态,以及VS是否将其视为"用户代码",您就可以看到正在发生的事情.

enter image description here

enter image description here


Asp.net相关问答推荐

C# - 将 xyz 平铺转换为纬度/经度,反之亦然,给出不同的结果

当前http上下文的http动词

在 aspx 页面中使用 if else 和 eval

我可以在 .net 核心中使用 Entity Framework 6(非核心)吗?

是否可以在没有那些 .svn 文件夹的情况下从 subversion 签出文件?

如何在没有实体框架的情况下使用 ASP.NET Identity 3.0

新的 ASP.NET MVC 5 应用程序如何知道如何创建数据库以及帐户控制器如何访问数据库?

免费的 ASP.Net 和/或 CSS 主题

与将 Web 应用程序保存在一个默认应用程序池中相比,拥有专用应用程序池的优缺点

LINQ:使用 Lambda 表达式获取 CheckBoxList 的所有选定值

使用 Moq 验证活动注册

HttpContext.Current 在 MVC 4 项目中未解决

VS 2010 中缺少 App_Code 文件夹

GridView 按代码隐藏列

服务器标签格式不正确错误

在.net的内存数据库中

我可以在加载事件时从 C# 的 div 标记中动态添加 HTML 吗?

Unity 中的单例每个调用上下文(Web 请求)

Application_End global.asax

jQuery Ajax 调用 - 成功设置变量值