我在调试模式下使用Visual Studio 2010,并且未选中“优化代码”。我无法快速监视(或悬停)调试器中的任何变量。我收到此错误“无法计算表达式,因为当前方法的代码已经过优化”。
即使是一行如下:int i = -3,快速监视i,我得到“无法获取本地或参数'i'的值,因为它在此指令指针处不可用,可能是因为它已被优化离开“。
类似问题中引用的此link似乎不适用。
我缺少一个设置吗?
答案 0 :(得分:158)
虽然项目处于调试模式,但解决方案却没有。当我改变它时,它起作用了。
答案 1 :(得分:45)
我在使用VS 2010时出现此问题。我的解决方案配置已选中(调试)。我通过取消选中项目属性下的Optimize Code属性来解决这个问题。 项目(右键单击)=>属性=> Build(tab)=>取消选中优化代码
答案 2 :(得分:28)
听起来您正在调试优化/发布版本,尽管未经检查优化框。你可以尝试的事情是:
如果你在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)
答案 16 :(得分:0)
对于受影响的项目,将其放下以免丢失:
项目属性 - >构建 - >高级 - >调试信息:完整。
在执行此操作之前,您需要检查是否已选择“调试”配置,除非您打算这样做。
答案 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)