在 VisualStudio2010中,“由于当前方法的代码已优化,因此无法计算表达式”

我正在调试模式下使用 VisualStudio2010,并且没有选中“优化代码”。我不能在调试器中快速观察(或悬停)任何变量。我得到这个错误“无法计算表达式,因为当前方法的代码已优化”。

即使是像: int i = -3这样的行,在 i 上做一个快速查看,我得到“无法获得本地或参数‘ i’的值,因为它在这个指令指针上不可用,可能是因为它已经被优化掉了。”

在类似问题中引用的这个 链接似乎不适用。

有什么我不知道的地方吗?

137024 次浏览

听起来好像您正在调试一个优化/发布版本,尽管没有选中优化框。你可以尝试的方法有:

  • 对解决方案文件进行完全重新生成(右键单击解决方案并选择“全部重新生成”)
  • 调试时,打开模块窗口(Debug-> Windows-> Module) ,并在已加载模块的列表中找到程序集。检查已加载程序集中列出的 Path 是否符合预期,并且修改后的文件时间戳表明程序集实际上已重新生成。
  • 模块窗口还应该告诉您加载的模块是否被优化-确保模块窗口表明它没有被优化。

如果你在 Debug-> Windows 菜单中看不到“模块”菜单项,那么你可能需要在“自定义...”菜单中添加它。

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

关闭可视化工作室并尝试删除 C: WindowsMicrosoft.NET Framework v2.0.50727临时 ASP.NET 文件中的临时文件

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

我在 VS2008中遇到了同样的问题,在我的案例中,它通过解决方案重建得到了解决。

我在使用 VS2010时遇到了这个问题。我的解决方案配置已选择(调试)。我通过取消选中项目属性下的 OptimizeCode 属性来解决这个问题。 Project (右击) = > Properties = > Build (tab) = > uncheck Optimize code

关于“ Optimize code”属性是 UNCHECKED 但是代码仍然在优化编译的问题: 在尝试了所有方法之后,最终帮助我的是在同一个设置页面(Project properties-Debug)上选中“ Enable unmanagement code Debug”复选框。它与代码优化没有直接关系,但是如果启用了这个功能,VS 就不再优化我的库,我可以进行调试。

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

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

我在 VS 2010中也遇到过同样的问题,清理和重建解决方案,并且成功了。

在 VS2013中,转到: Tools-> Options-> Debug-> General,并启用“ Use Managemablemode”。这将禁用新的函数计算行为。

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

[ .NET Framework 调试控件]
GenerateTrackingInfo = 1
AllowOptimize = 0 < br >

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

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

这在不能使用 debug 选项重新生成 dls 的情况下特别有效。

Http://www.hanselman.com/blog/debugvsreleasethebestofbothworlds.aspx

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

对于受影响的项目,放下以免丢失:

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

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

我知道这是以后的答案,但是我发现了另一个参考资料,提到了一种解决这个问题的方法,这种方法可能会在将来帮助到其他人。这个 网页描述了设置一个阻止优化的环境变量(COMPLUS _ ZapDisable = 1) ,至少对我来说是这样的!(不要忘记禁用 VisualStudio 宿主进程的第二部分。)在我的案例中,这可能更加相关,因为我正在通过符号服务器调试一个外部 DLL,但我不确定。

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

以上任何一个答案都没有涵盖我的情况。我发现了以下情况: 线程中的 MSDN 文章解释了当陷入一些原始的本机线程操作时,调试器无法访问数据。例如,当线程位于 Task 上时。等等,这个。

如果您试图调试 ASP.NET 项目,请确保项目的 Properties > Web > Servers 下拉列表设置为“ IIS Express”(除了检查这里的其他内容之外)。

我也有同样的问题。但是在我的案例中,Debuggable属性是硬编码在我的项目的 AssemblyInfo.cs文件中的,因此没有(过度)编写。它在删除指定 Debuggable属性的行之后工作。

我有一个 F # 项目遇到了这个问题,这个项目在 Visual Studio 和 MonoDevelope 之间来回穿梭,可能起源于后者(我忘了)。在 VS 中,没有选中优化框,但是就调试器而言,优化似乎确实发生了。

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

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

当您看到“ 无法计算表达式,因为当前方法的代码已优化。”消息后发出的 Debugger.Break()语句,然后请确保您按 F10步骤到下一个语句。

一旦单步执行到下一个语句,并假设您正在运行 Debug 构建,此消息应该会消失。

我在迁移到 VisualStudio2017时开始收到此消息。这一页上我尝试过的想法都不适合我。在另一篇文章中,我发现了这个建议,它确实起到了作用——删除:

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

... 从你的 AssemblyInfo 文件。

我混合了 c + +/cli mfc 扩展 dlls,即使在调试配置时也进行了优化(见 VS 2017模块窗口)。 正如前面的回答所建议的,我改变了“在 VS2013中,转到: Tools-> Options-> Debug-> General,并启用’使用托管兼容模式’。这将禁用新的函数计算行为。”这个设置也可以在 VS2017中找到。

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

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

然后重建,问题就解决了。

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

enter image description here

在 VisualStudio2012中,从 工具 > 调试 > 准时制启用“ 管理”选项对我来说很有用。

enter image description here