无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已经被优化掉了

时间:2011-11-29 13:12:20

标签: c# visual-studio-2010 debugging

Visual Studio 2010在不安全块中的某个函数参数中杀死(没有其他单词)数据。 什么可能导致此错误?调试器显示以下消息。

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

17 个答案:

答案 0 :(得分:269)

转到“项目属性”并在“构建”下确保"优化代码"复选框未选中。

另外,设置"调试信息"下降到" Full"在“高级选项”(“构建”选项卡下)中。

答案 1 :(得分:57)

如果在启用优化的情况下进行编译,则会删除许多变量;例如:

SomeType value = GetValue();
DoSomething(value);

这里通常会删除局部变量value,而是将值保留在堆栈上 - 有点像你写的那样:

DoSomething(GetValue());

此外,如果没有使用返回值 ,那么它将通过“pop”被删除(而不是通过“stloc”存储在本地,并且再次;本地将不存在)。

正因为如此,在这样的构建中,调试器无法获得value的当前值,因为它不存在 - 它仅存在于{{之间的短暂时刻1}}和GetValue()

因此;如果你想调试...不要使用发布版本!或者至少在调试时禁用优化。

答案 2 :(得分:22)

http://www.guntucomputerhacks.blogspot.com.au/2014/07/cannot-obtain-value-of-local-or.html

这在2013年的visual studio中对我有用。

你所要做的就是......

  1. 右键单击您无法调试的项目。
  2. 转到项目礼节。
  3. 点击构建菜单。
  4. 点击高级按钮。
  5. 将调试信息下拉值设置为完整。
  6. 重建您的项目。

答案 3 :(得分:17)

我刚碰到这个,我在Release构建配置而不是Debug构建配置下运行。一旦我切换回Debug,我的变量再次显示在手表中。

答案 4 :(得分:7)

当我遇到同样的问题时,我只需要在重建之前清理我的解决方案。这照顾了我。

答案 5 :(得分:6)

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

答案 6 :(得分:5)

我遇到了同样的问题,我的解决方案是将Solution ConfigurationRelease更改为Debug。希望它有所帮助

答案 7 :(得分:4)

在Visual Studio 2017中 转到Debug-> Option然后检查Debugging-> general-> 并选中此选项

relevant Visual Studio 2017 Options

答案 8 :(得分:3)

我发现在运行项目并通过附加到IIS进程进行调试时遇到了同样的问题。我也在调试模式下运行并关闭了优化。虽然我认为代码编译正常,但当我分离并尝试编译时,找不到其中一个引用。这是由于此处的另一位开发人员进行了修改并更改了引用的位置。引用没有显示警告符号,所以我认为在编译之前一切正常。一旦修复了参考并再次运行它就可以了。

答案 9 :(得分:2)

对于Web应用程序,还有一个重要的问题,那就是在应用程序发布过程中选择正确的配置。

您可以在调试模式下构建应用程序,但是可能会在发布模式下发布它,这默认情况下会优化代码,但IDE可能会误导您,因为发布的代码处于发布模式时它会显示调试模式。 您可以在下面的快照中查看详细信息: enter image description here

答案 10 :(得分:2)

在我的情况下,我正在开发一个web api项目,虽然项目已正确设置为完全调试,但每次我附加到我试图调试的IIS进程时,我仍然看到此错误。然后我意识到发布配置文件已设置为使用Release配置。如果您正在使用dotnet web api项目的“发布”功能,那么还有一个要检查的地方是您的发布配置文件。

答案 11 :(得分:1)

作为在调试Azure网站时遇到此问题的人的补充答案'网络应用程序:

例如,从GitHub部署时,默认情况下,代码在Azure服务器优化中编译。

我通过将SCM_BUILD_ARGS设置为/p:Configuration=Debug

告诉服务器以可调试的方式进行编译

但还有更多选择。看到这个: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git/

答案 12 :(得分:0)

在使用WPF应用程序之前遇到了相同的问题,并且此处的所有解决方案都无法解决问题。问题在于该模块已经过优化,因此以下解决方案不起作用(或不足以解决问题):

  • 优化代码”复选框未选中
  • 在模块加载时禁止JIT优化”已选中
  • 调试
  • 上的解决方案配置

该模块仍处于优化状态。请参阅以下屏幕截图: Optimized module


要解决此问题,您必须删除优化的模块。要找到优化的模块路径,可以使用Process Hacker之类的工具。

在“ 过程面板”中双击您的程序,然后在新窗口中打开“ .NET程序集”标签。然后,在“ 本地图像路径”列中,找到所有优化模块路径。找到您要取消优化的文件夹,然后删除文件夹(请参见下面的屏幕截图): enter image description here (出于明显的原因,我模糊了公司名称)

重新启动您的应用程序(正确选中了第1步中的复选框),它应该可以正常工作。

注意:由于文件被另一个进程打开,可能被锁定,请尝试关闭Visual Studio。如果文件仍被锁定,则可以使用Lock Hunter

之类的程序

答案 13 :(得分:0)

我有同样的问题。经过以上所有尝试,发现我还必须为项目删除{PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2和{PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2中的所有内容。它肯定与发布有关,因为尽管我在Azure Web App上使用了部署工具/ bitbucket,但由于要检查实际部署了哪些文件,所以我尝试了“构建>>发布>>发布到Azure”。

答案 14 :(得分:0)

在Visual Studio 2017或2015中:

转到解决方案,右键单击解决方案,然后选择“属性”->选择所有“配置”->“调试”,然后单击“确定”。 重建并运行之后,此解决方案对我有用。

答案 15 :(得分:0)

在Visual Studio 2012中:

转到项目属性 - >调试 - >取消选中"启用Visual Studio托管流程"

答案 16 :(得分:0)

检查AssemblyInfo文件中是否有Debuggable属性。如果有,请将其删除并重建您的解决方案,以查看本地变量是否可用。

我的debuggable属性设置为:DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints根据this MSDN article告诉JIT编译器使用优化。我从AssemblyInfo.cs文件中删除了这一行,并且局部变量可用。