Visual Studio 2010 中的“无法评估表达式,因为当前方法的代码已优化”

Posted

技术标签:

【中文标题】Visual Studio 2010 中的“无法评估表达式,因为当前方法的代码已优化”【英文标题】:"Cannot evaluate expression because the code of the current method is optimized" in Visual Studio 2010 【发布时间】:2011-03-27 14:10:25 【问题描述】:

我在调试模式下使用 Visual Studio 2010,并且未选中“优化代码”。我无法快速查看(或悬停在)调试器中的任何变量。我收到此错误“无法评估表达式,因为当前方法的代码已优化”。

即使是这样的行:int i = -3,对 i 进行快速观察,我得到“无法获取本地或参数 'i' 的值,因为它在该指令指针处不可用,可能是因为它已被优化离开。”

在类似问题中引用的 link 似乎不适用。

有没有我遗漏的设置?

【问题讨论】:

torulflundgren.blogspot.com.au/2010/03/… 这是我为此找到的最佳解决方案。我在 Visual Studio 2013 上对此进行了测试。并且工作了...... 【参考方案1】:

当项目处于调试模式时,解决方案不是。当我更改它时,它起作用了。

【讨论】:

我在 VS2012 中遇到了这个问题,但是解决方案和所有项目都设置为调试,没有优化。我清理解决方案/重建为我修复了它。 那么...如何将解决方案设置为非调试模式? user1431072 - 右键单击​​您的解决方案或项目并选择属性,然后您可以将其设置为调试模式【参考方案2】:

我在使用 VS 2010 时遇到了这个问题。我的解决方案配置已选择(调试)。我通过取消选中项目属性下的优化代码属性解决了这个问题。 项目(右键单击)=> 属性 => 构建(选项卡)=> 取消选中优化代码

【讨论】:

【参考方案3】:

尽管未选中优化框,但听起来您正在调试优化/发布版本。您可以尝试的方法是:

完全重建您的解决方案文件(右键单击解决方案并选择全部重建) 调试时打开模块窗口(调试 -> 窗口 -> 模块)并在已加载模块列表中找到您的程序集。检查针对您加载的程序集列出的路径是否符合您的预期,以及文件的修改时间戳是否表明程序集实际上已重建。 模块窗口还应该告诉您加载的模块是否经过优化 - 确保模块窗口指示它未优化。

如果在 Debug -> Windows 菜单中看不到 Modules 菜单项,则可能需要将其添加到“Customise...”菜单中。

【讨论】:

解决方案已重建。模块窗口显示组件已优化。我没有选中优化复选框,所以我不知道为什么程序集总是被优化。该解决方案有一个 Web 项目,但我正在查看的代码位于处于调试模式的类库项目中。 @Tony - 愚蠢的问题,但类库是否取消了“优化”复选框? 是的。我在我的问题中提到了这个事实。我已经回答了我自己的问题。 我的Project.Web 已优化未勾选,但当我在Debug > Modules 中查看其程序集时,它仍显示为已优化:( 我发现强制 VS 更新调试信息的唯一方法是增加模块的汇编版本,该版本仍然被认为是优化的,但未选中该选项。【参考方案4】:

对我来说,这发生在 VS2017 和 VS2019 中。 在我选择“模块加载时抑制 JIT 优化”选项后,它就停止了。

【讨论】:

+1,这是我的问题的原因。 VS 似乎不太擅长实际理解 csproj 选项,因为当配置以“调试”结束时,我在 XML 中关闭了优化。它在直接调用 MSBuild 时工作正常,但在 VS 本身中并不完全正确。 这解决了我的 Visual Studio 2019 问题实例【参考方案5】:

在 VS2013 中,转到:工具 -> 选项 -> 调试 -> 常规并启用“使用托管兼容模式”。这将禁用新的函数评估行为。

【讨论】:

谢谢!在提供的其他解决方案中,这对我来说很重要。奇怪的是它突然发生了,我想知道是什么导致它改变了。【参考方案6】:

尝试在调试模式下运行。如果您在发布模式下运行,您将收到此消息。

【讨论】:

问题说得很清楚,“我在调试模式下使用 Visual Studio 2010,我没有选中“优化代码”。” ...你应该删除这个非答案。 说真的。他在问题中说他正在调试中运行。我不明白为什么要投票。这个答案正在污染可能的解决方案 FWIW,当您搜索此错误消息时,此问题在 Google 上的排名很高。这个答案对我来说是正确的(我没有意识到我处于发布模式)。 他可能有多个程序集,并且在配置管理器中,他正在调试的程序集可以设置为发布或某事。【参考方案7】:

上述任何答案均未涵盖我的情况。我发现了以下内容:MSDN article on threading,它解释了当卡在一些原始的本机线程操作中时,调试器无法访问数据。例如,当一个线程位于 Task.Wait() 上时,就会出现这种情况。

【讨论】:

【参考方案8】:

我遇到了同样的问题。但在我的例子中,Debuggable 属性被硬编码在我项目的AssemblyInfo.cs 文件中,因此不会被编译(过度)写入。它在删除指定Debuggable 属性的行后起作用。

【讨论】:

【参考方案9】:

我在 VS2008 中遇到了同样的问题。就我而言,它是通过解决方案重建解决的。

【讨论】:

【参考方案10】:

除了提到的@Kragen,如果你正在调试一个 web 项目

关闭 Visual Studio 并尝试删除 C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 中的临时文件

【讨论】:

该解决方案有一个 Web 项目,但代码在类库项目中。我已经多次删除了临时文件。【参考方案11】:

您可以做的另一件事是,创建一个与已优化但具有 ini 扩展名的 dll 同名的文件,并在其中添加以下内容:

[.NET Framework 调试控件] 生成跟踪信息=1 AllowOptimize=0

这将告诉 JIT 不要优化您的变量。

请注意,您仍然需要 pdb,因此您最终会得到如下内容: 你的DLL.dll 你的DLL.pdb 你的DLL.ini

这在您无权使用调试选项重新生成 dll 的情况下特别有效。

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx

【讨论】:

【参考方案12】:

当您在发出Debugger.Break() 语句后看到“无法评估表达式,因为当前方法的代码已优化。”消息时,请确保您按 F10 进入下一条语句.

一旦进入下一条语句,假设您正在运行 Debug 构建,该消息应该会消失。

【讨论】:

就是这样。我已经尝试了上述所有解决方案,并且这个小问题解决了。感谢您分享它,如果没有看到这个微不足道的提示,我会浪费更多时间.. 没有。不工作。 vs17 仍然认为我在调试发布版本【参考方案13】:

关于“优化代码”属性未选中但代码仍编译为优化的问题:尝试一切后最终帮助我的是检查同一设置页面上的“启用非托管代码调试”复选框(项目属性 - 调试) .它与代码优化没有直接关系,但启用此功能后,VS 不再优化我的库,我可以调试。

【讨论】:

【参考方案14】:

我在从测试平台 Web 应用程序调试类库时遇到了同样的问题。我在测试平台中引用了发布版本,并且在类库属性中设置为优化。

在我写的时候,在类库属性中取消勾选发布版本的优化代码复选框,已经解决了这个问题。

【讨论】:

谢谢你这样做。您可以通过右键单击每个项目并选择其“属性”菜单选项,然后选择“构建”选项卡来找到此复选框。【参考方案15】:

我意识到这是稍后的答案,但我找到了另一个解决此问题的方法的参考,该方法可能会在未来帮助其他人。这个web page 描述了设置一个防止优化的环境变量(COMPLUS_ZapDisable=1),至少它对我有用! (不要忘记禁用 Visual Studio 托管进程的第二部分。)在我的情况下,这可能更相关,因为我正在通过符号服务器调试外部 DLL,但我不确定。

【讨论】:

【参考方案16】:

我曾在 Visual Studio 和 MonoDevelop 之间的一个 F# 项目中遇到过这个问题,可能源于后者(我忘记了)。在 VS 中,优化框未被选中,但就调试器而言,优化似乎确实发生了。

在将项目文件的 XML 与健康项目文件的 XML 进行比较后,问题很明显:健康项目有一个明确的 <optimize>false</optimize> 行,而坏项目则完全丢失了它。 VS 显然是从它的缺失推断出优化被禁用,而编译器正在做相反的事情。

解决方案是将此属性添加到项目文件中,然后重新加载。

【讨论】:

【参考方案17】:

当我迁移到 Visual Studio 2017 时,我开始收到此消息。我尝试过的此页面上的所有想法都不适合我。在另一篇文章中,我发现了这个建议并且它确实有效 - 删除:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

...来自您的 AssemblyInfo 文件。

【讨论】:

爱你@Crazy Cat。当我迁移到 VS2019 时,我也遇到过这种情况。【参考方案18】:

我在 VS 2010 中遇到了同样的问题。清理并重建解决方案,它工作正常。

【讨论】:

【参考方案19】:

上面vickramds 的评论,指的是http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html,是为我做的。我检查了所有内容 - 从本地 bin 文件夹中删除了所有 dll、pdb 文件、清理、重建、清除了所有临时 ASP.NET 文件的文件夹、确保设置了 TRACE/DEBUG 标志、检查了 DLL 路径等。

为受影响的项目将其放下以免丢失:

项目属性 --> 构建 --> 高级 --> 调试信息:完整。

在执行此操作之前,您需要检查是否选择了调试配置,当然,除非您另有打算。

【讨论】:

【参考方案20】:

如果您尝试调试 ASP.NET 项目,请确保项目的属性 > Web > 服务器下拉菜单设置为“IIS Express”(除了检查此处的所有其他内容)。

【讨论】:

【参考方案21】:

我混合了 c++/cli mfc 扩展 dll,即使调试配置也得到了优化(从 VS 2017 模块窗口中看到)。 正如之前的回答所建议的那样,我更改了“在 VS2013 中,转到:工具 -> 选项 -> 调试 -> 常规并启用‘使用托管兼容模式’。这会禁用新的函数评估行为。”该设置也可以在 VS 2017 中找到。

但这还不够,所以我还将 UseDebugLibraries 设置从另一个 MFC 应用程序的项目文件复制到扩展 dll 项目文件。

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

然后重建并解决问题。

【讨论】:

【参考方案22】:

在 Visual Studio 2012 中,从 Tools > Debugging > Just-In-Time 启用“Managed”选项对我有用。

【讨论】:

以上是关于Visual Studio 2010 中的“无法评估表达式,因为当前方法的代码已优化”的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2010中调用另外一个项目中的方法

似乎无法忽略 Visual Studio 2010 中的库

Visual Studio 2010 中的传输文件功能

Visual Studio 2010 中的代码自动清理

Visual Studio 2010中的多个输出窗口

Visual Studio 2010 中的负载测试执行时间