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

VisualStudio2010在不安全块中的函数的一个参数中杀死(没有其他词)数据。 是什么导致了这个错误? 调试器显示了下面的消息。

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

如果你在编译时启用了优化,那么许多变量将被删除;例如:

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

在这里,局部变量value通常会被删除,而将其值保留在堆栈中——有点像你写的:

DoSomething(GetValue());

同样,如果返回值为根本不用,则它将通过“pop”删除(而不是通过“stloc”存储在本地,并且再次;本地将不存在)。

正因为如此,在这样的构建中,调试器无法获得value的当前值,因为它不存在 -它只存在于GetValue()DoSomething(...)之间的短暂瞬间。

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

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

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

当我面临同样的问题时,我只需要在重建之前清理我的解决方案。这帮我解决了问题。

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

此外,在高级选项(在构建选项卡下)中将“调试信息”下拉菜单设置为“完全”。

对于那些在调试Azure网站的web应用程序时遇到此问题的人,还有一个额外的答案:

例如,当从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/ < / p >

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

< p >也 在VS 2015社区版

< p > 调试->选项或工具->选项

. < p >和检查 Debugging->General->抑制模块负载上的JIT优化(仅Managed)

. bb0 . bb0 . > . bb0 . bb0 . >

检查您的AssemblyInfo文件中是否有Debuggable属性。如果存在,则删除它并重新构建解决方案,以查看本地变量是否可用。

我的可调试属性被设置为:DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints,根据这篇MSDN文章告诉JIT编译器使用优化。我从我的AssemblyInfo.cs文件中删除了这一行,本地变量就可用了。

在Visual Studio 2012中:

打开项目属性->调试->取消选中“启用Visual Studio托管进程”

以我为例,我正在开发一个web api项目,尽管该项目被正确地设置为完全调试,但每当我连接到我试图调试的IIS进程时,我仍然会看到这个错误。然后我意识到发布概要文件被设置为使用发布配置。所以,如果你正在使用dotnet web api项目的“发布”功能,还有一个地方要检查你的发布配置文件。

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

在visual Studio 2017 去调试->选项,然后检查调试->通用-> 检查这个选项

relevant Visual Studio 2017 Options

在Visual Studio 2017或2015中:

进入解决方案右键单击解决方案,然后选择属性->选择所有配置->调试,然后单击确定。 在“重新构建并运行”之后,这个解决方案对我来说是有效的。< / p >

我也有同样的问题。尝试以上所有方法,发现我还必须删除{PROJECT_ROOT}\bin\Release\netcoreapp2.2和{PROJECT_ROOT}\obj\Release\netcoreapp2.2内的所有内容。它肯定与发布有关,因为虽然我在我的Azure Web应用程序上使用部署工具/ bitbucket,但我确实尝试了Build >> Publish >> Publish to Azure,因为我想检查哪些文件实际部署了。

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

你可以在调试模式下构建你的应用,但它可能发生在你以发布模式发布它,默认情况下优化代码,但IDE可能会误导你,因为它显示调试模式,而发布的代码是在发布模式。 你可以在下面的快照中看到详细信息: enter image description here < / p >

在WPF应用程序和这里所有的解决方案都不能解决问题之前有同样的问题。问题是模块已经被优化了,所以之前的解决方案不要工作(或不足以解决问题):

  • 优化代码"复选框如故
  • 抑制模块负载上的JIT优化"检查
  • 调试上的解决方案配置

模块仍处于加载优化状态。请看下面的截图: 优化模块 < / p >


解决这个问题你必须删除优化的模块。要找到优化的模块路径,可以使用类似过程的黑客的工具。

双击"流程面板"然后在新窗口打开标签"net程序集"然后在"本机映像路径"你会发现所有优化模块路径。找到一个你想去优化和删除文件夹(见下面的截图): enter image description here (由于明显的原因,我模糊了我的公司名称)

重新启动应用程序(步骤1中的复选框被正确选中),它应该工作。

请注意:该文件可能是锁着的,因为它是由另一个进程打开的,尝试关闭Visual Studio。如果文件仍然被锁定,你可以使用类似锁猎人的程序