在Visual Studio 2022调试会话期间,我正在使用源代码链接和Microsoft符号服务器调试一些ASP.NET内部代码,我无法查看变量,因为它已被优化;然而,Quickview有一个选项“禁用托管优化并重新启动调试”。我选择了它,调试重新启动,我确实能够查看变量。但是,我现在担心我禁用了一些优化,这可能会减慢速度,我不清楚选择该选项实际上会改变什么。在Visual Studio中会改变哪些设置,以及如何重新启用托管优化?
下面是一些屏幕截图,显示了该选项在UI下拉列表中的外观以及单击时的情况:
2条答案
按热度按时间8dtrkrch1#
Background-info:.NET中不同类型的优化
在许多编译语言中,如C和C++,通常只有一个地方应用优化:当你运行你的编译器的时候(尽管对于旧的工具链来说,有单独的编译器和链接器,有单独的编译时和链接时优化也是很常见的)。
但在.NET世界中,它稍微复杂一些:
csc
C#-to-IL(或VB .NET-to-IL、F#等)编译器可以优化从C#(the/optimize
flag)生成的IL。if( false ) { /* here */ }
块的内容)。.dll
或.exe
)时,JIT可以应用自己的优化。DebuggableAttribute( DebuggingModes.DisableOptimizations )
或isJITOptimizerDisabled: false
的程序集-此属性在usingcsc.exe
with/debug
时添加到程序集。ngen.exe
生成的-它(since Windows 8)* 可以 * 在后台抢先编译程序集,而无需手动运行ngen.exe
。CrossGen2
。readytorun
和/或AOT编译的程序集不同,它们有自己的优化,超出了这个答案的范围。推荐阅读
[assembly: Debuggable]
/DebuggableAttribute
在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是否将其视为“用户代码”,则可以看到发生了什么。
js4nwp542#
优化的NOT TURNED将简单地“不”编译代码运行得更快(作为编译的机器代码)。因此,您可以单步执行并查看您的代码变量。然而,在调试具有大量代码的大型应用程序时,未摘要化的代码将运行得相当慢。因此,您可以选择允许您的代码运行得更快,但随后调试过程THEN无法使用或查看变量的值,如果代码已经被概括,那么在大多数情况下,这意味着它被编译成机器码,并且调试器实际上不能显示变量的值,甚至不允许断点。
在某种意义上,如果您允许优化,那么您运行的代码就像它将以“发布模式”运行一样,因此选项和调试此类代码的能力大大降低。
由于今天的计算机具有如此巨大的速度和处理能力,那么我会接受在几乎所有情况下,您都希望禁用优化来调试代码。