“无法计算表达式,因为Visual Studio 2010中的当前方法的代码已经过优化”

时间:2010-08-10 00:41:47

标签: c# visual-studio visual-studio-2010

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

即使是一行如下:int i = -3,快速监视i,我得到“无法获取本地或参数'i'的值,因为它在此指令指针处不可用,可能是因为它已被优化离开“。

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

我缺少一个设置吗?

22 个答案:

答案 0 :(得分:158)

虽然项目处于调试模式,但解决方案却没有。当我改变它时,它起作用了。

答案 1 :(得分:45)

我在使用VS 2010时出现此问题。我的解决方案配置已选中(调试)。我通过取消选中项目属性下的Optimize Code属性来解决这个问题。 项目(右键单击)=>属性=> Build(tab)=>取消选中优化代码

答案 2 :(得分:28)

听起来您正在调试优化/发布版本,尽管未经检查优化框。你可以尝试的事情是:

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

如果你在Debug - >中看不到Modules菜单项。 Windows菜单然后您可能需要在“自定义...”菜单中添加它。

答案 3 :(得分:14)

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

答案 4 :(得分:9)

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

答案 5 :(得分:6)

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

答案 6 :(得分:5)

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

答案 7 :(得分:5)

我遇到了同样的问题。但在我的情况下,Debuggable属性在我的项目的AssemblyInfo.cs文件中被硬编码,因此没有(过度)编译。删除指定Debuggable属性的行后,它可以工作。

答案 8 :(得分:4)

除了@Kragen之外,如果您正在调试一个Web项目

关闭visual studio并尝试删除C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

中的临时文件

答案 9 :(得分:4)

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

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

答案 10 :(得分:4)

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

[.NET Framework调试控制]
GenerateTrackingInfo = 1
AllowOptimize = 0

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

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

当您无法使用调试选项重新生成dll时,这种情况特别适用。

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

答案 11 :(得分:3)

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

答案 12 :(得分:3)

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

将项目文件的XML与健康项目的XML进行比较后,问题显而易见:健康项目有一条明确的$queryBuilder ->select('u') ->from('users', 'u') ->leftJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id') 行,而坏项则完全错过了它。 VS显然是因为缺席而推断优化被禁用,而编译器正在做相反的事情。

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

答案 13 :(得分:3)

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

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

答案 14 :(得分:3)

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

答案 15 :(得分:1)

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

enter image description here

答案 16 :(得分:0)

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

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

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

在执行此操作之前,您需要检查是否已选择“调试”配置,除非您打算这样做。

答案 17 :(得分:0)

如果您正在尝试调试ASP.NET项目,请确保项目的属性>网络>服务器下拉列表设置为" IIS Express" (除了检查其他一切)。

答案 18 :(得分:0)

我在VS 2010中遇到了同样的问题。清理并重建解决方案并且有效。

答案 19 :(得分:0)

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

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

...来自AssemblyInfo文件。

答案 20 :(得分:0)

我混合使用c ++ / cli mfc扩展dll,即使调试配置也已优化(可从VS 2017模块窗口中查看)。 如先前的答案建议,我更改了“在VS2013中,转到:工具->选项->调试->常规,并启用'使用托管兼容模式'。这将禁用新功能评估行为。”在VS 2017中也可以找到该设置。

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

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

然后重建并解决了问题。

答案 21 :(得分:0)

在Visual Studio 2012中,启用工具>调试>即时中的“ 托管”选项对我有用。

enter image description here