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


153

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

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

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

有我缺少的设置吗?


4
torulflundgren.blogspot.com.au/2010/03/…这是我为此找到的最佳解决方案。我测试了这个视觉工作室2013年和工作... ...
Dulanjana Wickramatantri

Answers:


167

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


9
我在VS2012中遇到了这个问题,但是该解决方案和所有项目都设置为“调试”,没有进行任何优化。我为我清理解决方案/重建。
saarp

20
那么...您如何将解决方案设置为非调试模式?
user1431072

user1431072-您右键单击您的解决方案或项目并选择属性,然后可以将其设置为调试模式
Yevgraf Andreyevich Zhivago

48

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


29

听起来好像您正在调试优化/发布版本,尽管未选中优化框。您可以尝试的操作有:

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

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


2
解决方案被重建。模块窗口显示装配已优化。我没有选中“优化”复选框,所以我不知道为什么总会优化该程序集。该解决方案有一个Web项目,但是我正在查看的代码是在调试模式下的类库项目中。
Tony_Henrich

@Tony-愚蠢的问题,但是类库是否取消选择了“ Optimized”复选框?
贾斯汀

是。我在问题中提到了这个事实。我已经回答了我自己的问题。
Tony_Henrich 2010年

1
我的Project.Web优化未选中,但当我在Debug > Modules:(
J86

我发现强迫VS更新调试信息的唯一方法是增加仍被认为是优化的模块的程序集版本,而未选中该选项。
alphanoch

14

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


谢谢!在提供的其他解决方案中,这对我很重要。奇怪的是它突然发生了,我想知道是什么导致了它的改变。
squid808 '16

10

尝试以调试模式运行。如果以发布模式运行,则会收到此消息。


5
问题说来很简单:“我正在调试模式下使用Visual Studio 2010,并且未选中“优化代码”。” ...您应删除此非答案。
Jim Balter

说真的 他说这是在调试中运行。我不明白为什么要投票。这个答案正在污染可能的解决方案
John Demetriou

1
FWIW,当您搜索此错误消息时,此问题在Google上的排名很高。这个答案对我来说是正确的(我不知道自己处于发布模式)。
Nate Barbettini

他可能有多个装配件,并且可以在配置管理器中将要调试的装配件设置为发布或其他。
madoxdev

8

以上任何答案均未涵盖我的情况。我发现了以下内容:关于线程的MSDN文章,它解释说,当卡在某些原始的本机线程操作中时,调试器将无法访问数据。例如,当线程位于Task.Wait()上时,出现此错误。


8

我有同样的问题。但是在我的情况下,该Debuggable属性已硬编码在AssemblyInfo.cs我的项目文件中,因此没有(过度)通过编译写入。在删除指定Debuggable属性的行后,它起作用了。


8

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

在此处输入图片说明


+1,这是我遇到问题的原因。VS似乎不太善于实际理解csproj选项,因为当配置以“ Debug”结尾时,我在XML中关闭了优化功能。直接调用MSBuild时效果很好,但在VS本身中不太正确。
TheBeardedQuack

5

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


4

除了提到的@Kragen,如果要调试Web项目

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


该解决方案有一个Web项目,但是代码在类库项目中。我已多次删除临时文件。
Tony_Henrich

4

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

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

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

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

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

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


4

发出语句后,看到“ 由于当前方法的代码已优化,无法评估表达式。 ”消息,Debugger.Break()请确保按F10键转到下一条语句。

一旦转到下一条语句,并假设您正在运行调试版本,此消息应消失。


2
就是这样 我已经尝试了所有的解决方案上面,这小东西制定了..谢谢你的分享,我会浪费更多的时间没有看到这个小提示..
克日什托夫·Szynter

没事 不工作。Vs17仍然认为我正在调试发行版本
John Demetriou

3

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


3

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

就在我撰写本文时,取消选中类库属性中发行版的“优化代码”复选框已解决了该问题。


谢谢,做到了。您可以通过右键单击每个项目并选择其“属性”菜单,“构建”选项卡来找到此复选框。
goamn 2014年

3

我知道这是一个以后的答案,但是我找到了另一种解决该问题的方法的参考,该方法将来可能会对其他人有所帮助。此网页介绍了设置环境变量(COMPLUS_ZapDisable = 1)来防止优化的过程,至少对我而言是如此!(别忘了禁用Visual Studio托管过程的第二部分。)就我而言,这可能更有意义,因为我正在通过符号服务器调试外部DLL,但不确定。


3

我在Visual Studio和MonoDevelop之间到处都是F#项目时遇到了这个问题,可能是后者引起的(我忘了)。在VS中,未选中“优化”框,但是就调试器而言,优化似乎确实正在发生。

在将项目文件的XML与正常文件的XML进行比较之后,问题显而易见:正常项目具有明确的<optimize>false</optimize>行,而不良项目则完全丢失了它。VS显然是从缺少它的情况中推断出优化被禁用,而编译器则相反。

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


1

迁移到Visual Studio 2017时,我开始收到此消息。此页面上尝试的所有想法都不适用于我。在另一篇文章中,我发现了这个建议,并且它可以正常工作-删除:

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

...从您的AssemblyInfo文件中。


爱你@疯狂的猫。当我迁移到VS2019时,这发生在我身上。
安东尼奥·罗德里格斯


0

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

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

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

在执行此操作之前,您要检查是否已选择“调试”配置,当然,除非另有说明。


0

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


0

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

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

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

然后重建并解决问题。


0

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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.