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.
答案 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中对我有用。
你所要做的就是......
答案 3 :(得分:17)
我刚碰到这个,我在Release
构建配置而不是Debug
构建配置下运行。一旦我切换回Debug
,我的变量再次显示在手表中。
答案 4 :(得分:7)
当我遇到同样的问题时,我只需要在重建之前清理我的解决方案。这照顾了我。
答案 5 :(得分:6)
关于“优化代码”属性是UNCHECKED的问题,但代码仍然编译为优化:在尝试所有内容后最终帮助我的是在同一设置页面上检查“启用非托管代码调试”复选框(项目属性 - 调试) 。它与代码优化没有直接关系,但启用此功能后,VS不再优化我的库,我可以进行调试。
答案 6 :(得分:5)
我遇到了同样的问题,我的解决方案是将Solution Configuration
从Release
更改为Debug
。希望它有所帮助
答案 7 :(得分:4)
答案 8 :(得分:3)
我发现在运行项目并通过附加到IIS进程进行调试时遇到了同样的问题。我也在调试模式下运行并关闭了优化。虽然我认为代码编译正常,但当我分离并尝试编译时,找不到其中一个引用。这是由于此处的另一位开发人员进行了修改并更改了引用的位置。引用没有显示警告符号,所以我认为在编译之前一切正常。一旦修复了参考并再次运行它就可以了。
答案 9 :(得分:2)
对于Web应用程序,还有一个重要的问题,那就是在应用程序发布过程中选择正确的配置。
您可以在调试模式下构建应用程序,但是可能会在发布模式下发布它,这默认情况下会优化代码,但IDE可能会误导您,因为发布的代码处于发布模式时它会显示调试模式。 您可以在下面的快照中查看详细信息:
答案 10 :(得分:2)
在我的情况下,我正在开发一个web api项目,虽然项目已正确设置为完全调试,但每次我附加到我试图调试的IIS进程时,我仍然看到此错误。然后我意识到发布配置文件已设置为使用Release配置。如果您正在使用dotnet web api项目的“发布”功能,那么还有一个要检查的地方是您的发布配置文件。
答案 11 :(得分:1)
作为在调试Azure网站时遇到此问题的人的补充答案'网络应用程序:
例如,从GitHub部署时,默认情况下,代码在Azure服务器优化中编译。
我通过将SCM_BUILD_ARGS
设置为/p:Configuration=Debug
答案 12 :(得分:0)
在使用WPF应用程序之前遇到了相同的问题,并且此处的所有解决方案都无法解决问题。问题在于该模块已经过优化,因此以下解决方案不起作用(或不足以解决问题):
要解决此问题,您必须删除优化的模块。要找到优化的模块路径,可以使用Process Hacker之类的工具。
在“ 过程面板”中双击您的程序,然后在新窗口中打开“ .NET程序集”标签。然后,在“ 本地图像路径”列中,找到所有优化模块路径。找到您要取消优化的文件夹,然后删除文件夹(请参见下面的屏幕截图): (出于明显的原因,我模糊了公司名称)
重新启动您的应用程序(正确选中了第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文件中删除了这一行,并且局部变量可用。