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

h7wcgrx3  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(380)

在Visual Studio 2022调试会话期间,我正在使用源代码链接和Microsoft符号服务器调试一些ASP.NET内部代码,我无法查看变量,因为它已被优化;然而,Quickview有一个选项“禁用托管优化并重新启动调试”。我选择了它,调试重新启动,我确实能够查看变量。但是,我现在担心我禁用了一些优化,这可能会减慢速度,我不清楚选择该选项实际上会改变什么。在Visual Studio中会改变哪些设置,以及如何重新启用托管优化?
下面是一些屏幕截图,显示了该选项在UI下拉列表中的外观以及单击时的情况:

8dtrkrch

8dtrkrch1#

Background-info:.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时优化 * 不 * 应用于DebuggableAttribute( DebuggingModes.DisableOptimizations )isJITOptimizerDisabled: false的程序集-此属性在using csc.exe with /debug时添加到程序集。
  • 虽然严格来说不是编译器“优化”,但当.NET程序运行时,CLR可能会加载托管程序集的缓存native-image versions,这是特定于您的机器的。
  • 对于.NET Framework 1.x-4.x程序集,这些本机映像是由ngen.exe生成的-它(since Windows 8)* 可以 * 在后台抢先编译程序集,而无需手动运行ngen.exe
  • 对于.NET 5+,see CrossGen2
  • 这与readytorun和/或AOT编译的程序集不同,它们有自己的优化,超出了这个答案的范围。

推荐阅读

在Visual Studio中,“禁用托管优化并重新启动调试”实际上更改了哪些设置?
消息框允许您更改工具〉选项〉调试下的“Suppress JIT optimization on module load(Managed only)”设置:

然而,我现在担心我已经禁用了一些优化,这可能会减慢速度
不用担心:“*Suppress JIT optimization... *”设置只会在调试时阻止非项目程序集的JIT优化-尽管在许多情况下仍会使用ngen'd映像(因此仍会运行优化的cod,除非您使用COMPlus_ZapDisable)。
在Visual Studio中会更改哪些设置?如何重新启用托管优化?
转到调试器设置并取消选中“抑制JIT优化...”选项。
如果您使用Debugger Modules窗口查看加载的每个.NET程序集,沿着它的JIT优化状态、符号状态,以及VS是否将其视为“用户代码”,则可以看到发生了什么。

js4nwp54

js4nwp542#

优化的NOT TURNED将简单地“不”编译代码运行得更快(作为编译的机器代码)。因此,您可以单步执行并查看您的代码变量。然而,在调试具有大量代码的大型应用程序时,未摘要化的代码将运行得相当慢。因此,您可以选择允许您的代码运行得更快,但随后调试过程THEN无法使用或查看变量的值,如果代码已经被概括,那么在大多数情况下,这意味着它被编译成机器码,并且调试器实际上不能显示变量的值,甚至不允许断点。
在某种意义上,如果您允许优化,那么您运行的代码就像它将以“发布模式”运行一样,因此选项和调试此类代码的能力大大降低。
由于今天的计算机具有如此巨大的速度和处理能力,那么我会接受在几乎所有情况下,您都希望禁用优化来调试代码。

相关问题