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


211

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.

2
我有完全相同的问题,我正在使用Debug build。Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered 2012年

19
糟糕,我刚刚选择的发布是被误选了。–
丹尼尔·利特尔

我在VS 2017中遇到这个问题,并且已经按照以下帖子中的所有说明进行操作。还有其他选择吗?
马特W,

不要忘记Menu Build-> Configuration Manager。需要将配置设置为“调试”,否则您仍然会遇到问题。
鲍勃·克莱格

Answers:


344

转到“项目属性”,然后在“生成”下,确保未选中“优化代码”复选框。

此外,在“高级选项”(“内部”选项卡)中,将“调试信息”下拉列表设置为“完整”。


128
首先,检查“生成配置”是“调试”,而不是“发布”。
ApceH Hypocrite

顺便说一句,如果要在发布模式下进行测试,则可以添加“ Debugger.Launch();”。在代码中
Jason

完成两个步骤,并将配置从“发布”更改为“构建”。在Visual Studio 2017社区版上工作。

1
如果您拥有VS 2017,则既可以接受接受的答案,也可以通过xyq.384.b获得答案。对我来说,xyq.384.b的答案是解决方案,因为正是JIT调试器抑制了指针...对不起,JIT将其“优化”了……
BillRuhl

切换到调试配置后,我发现优化代码框已被取消选中。获得的经验教训:不要在发布配置模式下进行调试。
eliteproxy

135

也在VS 2015 Community Edition中

转到调试->选项或工具->选项

并检查Debugging-> General-> Suppress JIT Optimization on module load(仅受管理)


7
应用了上述所有解决方案后,这解决了我的问题。
2013年

1
建议的答案均不适合我。我的变量仍在优化中……
Sushi271 '18

不知道为什么这突然开始发生..但这已经解决了!
Murphybro2 '18

废话,这也为我在VS2017社区中修复了!不知道何时或如何取消选择此选项...
Ian Kemp

像冠军一样工作!
BillRuhl

59

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

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

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

DoSomething(GetValue());

另外,如果有返回值 根本没有使用,则将通过“ pop”将其删除(而不是通过“ stloc”存储在本地中,并且再次;本地将不存在)。

因此,在这样的构建中,调试器无法获得的当前值,value因为它不存在 -它仅存在于GetValue()DoSomething(...)

所以; 如果要调试...请不要使用发行版!或至少在调试时禁用优化。


4
感谢您的回答-但我在我的项目中选中了优化代码属性,但未选中=(
curiousity

4
@Marc-我理解您在说什么,但是,我正在使用Microsoft的参考源库来逐步编写自己的废话。我现在正在遍历各种方法,但是似乎看不到任何本地人的价值观。那么调试.Net源代码有什么意义呢?有什么建议?stackoverflow.com/questions/13147132/...
one.beat.consumer

我似乎在做与@ one.beat.consumer相同的事情:尝试逐步通过Microsoft公共符号来了解ASP.NET框架为何不起作用。就我而言,MVC 3中的模型绑定...
bambams 2014年

我假设@ one.beat.consumer是因为Microsoft引用是在启用优化的情况下编译的,因此即使您可以下载其源代码以观看它的值逐步消失,也就好像您使用优化来编译项目一样已启用。它是特定于项目(dll)的-如果您可以获取MS参考的“调试”版本,则可以看到值。不要忘记,如果MS dll被主项目引用的另一个项目引用,则“子引用”可能与另一个项目的设置匹配。
drzaus


20

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



8

当我遇到同样的问题时,我只需要在重新构建之前清洗解决方案即可。那为我照顾了。


6

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


1
第二个建议使它再次正常工作,谢谢!
CodeMilian 2014年

1
在VS 2015中,我看不到Enable unmanaged code debugging。有Enable native code debugging,我尝试检查此内容,但没有区别。
Al Lelopath '16

1
在VS 2015中,我检查了项目版本,Web,调试器中的“启用本机代码”,所有这些都起作用。
莫菲特

6

我所面临的同样的问题,我的解决办法是改变Solution ConfigurationReleaseDebug。希望能帮助到你


4

就我而言,我正在开发一个Web api项目,尽管该项目已正确设置为完全调试,但每次我连接到要调试的IIS进程时,仍然会看到此错误。然后我意识到将发布配置文件设置为使用发布配置。因此,如果您使用的是dotnet Web api项目的“发布”功能,那么还要检查发布个人资料。


3

我发现在运行项目并通过附加到IIS进程进行调试时遇到了同样的问题。我还以调试模式运行,并且关闭了优化功能。虽然我认为代码可以很好地编译,但是当我分离并尝试编译时,没有找到参考之一。这是由于此处的另一个开发人员进行了修改并更改了引用的位置。该引用未显示警告符号,因此我认为一切正常,直到进行编译为止。修复参考并再次运行后,它就可以工作了。



1

在Visual Studio 2012中:

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


1

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

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


0

检查以查看AssemblyInfo文件中是否具有Debuggable属性。如果有,请将其删除并重新生成解决方案,以查看局部变量是否可用。

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


0

在Visual Studio 2017或2015中:

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


0

我遇到过同样的问题。经过以上所有尝试,发现我还必须为项目删除{PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2和{PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2内的所有内容。它绝对与发布有关,因为尽管我在Azure Web App上使用了部署工具/ bitbucket,但我还是尝试尝试将Build >> Publish >> Publish to publish to Azure,因为我想检查实际部署了哪些文件。


0

WPF应用程序之前曾遇到过相同的问题,并且此处的所有解决方案都无法解决该问题。问题是,该模块已经优化,所以下面的解决方案DO NOT WORKS(或者是不足以解决问题的):

  • 未选中“ 优化代码 ”复选框
  • 抑制模块加载时的JIT优化 ”已选中
  • DEBUG上的解决方案配置

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


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

在“ 过程面板 ”中双击您的程序,然后在新窗口中打开“ .NET程序集 ” 选项卡。然后在“本机映像路径 ” 列中找到所有“ 优化模块”路径。找到您要取消优化的文件夹删除该文件夹(请参见下面的屏幕截图): 在此处输入图片说明 出于明显的原因,我模糊了公司名称)

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

注意:文件可能已被其他进程打开,因此可能被锁定,请尝试关闭Visual Studio。如果文件仍被锁定,则可以使用诸如Lock Hunter之类的程序

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.