我正在调试模式下使用 VisualStudio2010,并且没有选中“优化代码”。我不能在调试器中快速观察(或悬停)任何变量。我得到这个错误“无法计算表达式,因为当前方法的代码已优化”。
即使是像: int i = -3这样的行,在 i 上做一个快速查看,我得到“无法获得本地或参数‘ i’的值,因为它在这个指令指针上不可用,可能是因为它已经被优化掉了。”
在类似问题中引用的这个 链接似乎不适用。
有什么我不知道的地方吗?
听起来好像您正在调试一个优化/发布版本,尽管没有选中优化框。你可以尝试的方法有:
如果你在 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属性的行之后工作。
Debuggable
AssemblyInfo.cs
我有一个 F # 项目遇到了这个问题,这个项目在 Visual Studio 和 MonoDevelope 之间来回穿梭,可能起源于后者(我忘了)。在 VS 中,没有选中优化框,但是就调试器而言,优化似乎确实发生了。
在将项目文件的 XML 与健康项目的 XML 进行比较之后,问题显而易见: 健康项目有一个明确的 <optimize>false</optimize>行,而不健康的项目完全没有这一行。VS 显然是从它的缺失推断出优化是禁用的,而编译器正在做相反的事情。
<optimize>false</optimize>
解决方案是将此属性添加到项目文件中,然后重新加载。
当您看到“ 无法计算表达式,因为当前方法的代码已优化。”消息后发出的 Debugger.Break()语句,然后请确保您按 F10步骤到下一个语句。
Debugger.Break()
一旦单步执行到下一个语句,并假设您正在运行 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 优化”选项之后,这种情况就停止了。
在 VisualStudio2012中,从 工具 > 调试 > 准时制启用“ 管理”选项对我来说很有用。